3132 votes

Comment concaténer des variables de type chaîne en Bash ?

En PHP, j'ajouterais les chaînes ensemble comme ceci :

$foo = "Hello";
$foo .= " World";

Alors $foo serait "Hello World"

Comment puis-je faire ça en Bash ?

8 votes

foo="Hello" foo=$foo" World" echo $foo cela a plutôt fonctionné pour "#!/bin/sh"

1 votes

Que faire si vous voulez HelloWorld sans espace ?

0 votes

@Adi foo1="World" foo2="Hello" foo3="$foo1$foo2"

4273voto

codaddict Points 154968
foo="Hello"
foo="$foo World"
echo $foo
> Hello World

En général, pour concaténer deux variables, il suffit de les écrire l'une après l'autre :

a='hello'
b='world'
c=$a$b
echo $c
> helloworld

339 votes

C'est probablement une bonne chose de prendre l'habitude de mettre $foo entre guillemets, pour les moments où cela compte vraiment.

113 votes

On nous apprend à toujours faire cela, car lorsque la substitution a lieu, les espaces sont ignorés par l'interpréteur de commandes, mais les guillemets doubles protègent toujours ces espaces.

67 votes

Doit-il y avoir un espace dans votre premier exemple ? Est-il possible de faire quelque chose comme foo="$fooworld" ? Je suppose que non...

1240voto

thkala Points 36148

Bash prend également en charge l'opérateur +=, comme le montre la transcription suivante :

$ A="X Y"
$ A+="Z"
$ echo "$A"
X YZ

2 votes

Puis-je utiliser cette syntaxe avec le mot-clé d'exportation ? par exemple export A+="Z" ou peut-être le A ne doit être exportée qu'une seule fois ?

4 votes

@levesque : Les deux :-). Les variables ne doivent être exportées qu'une seule fois, mais export A+=Z fonctionne également très bien.

50 votes

Puisqu'il s'agit d'un bashisme, je pense que cela vaut la peine de mentionner que vous ne devriez jamais utiliser #!/bin/sh dans un script en utilisant cette construction.

1023voto

F. Hauri Points 5893

bash premièrement

Comme cette question s'adresse spécifiquement à bash La première partie de ma réponse présente les différentes manières de procéder :

+= : Ajouter à la variable

La syntaxe += peuvent être utilisés de différentes manières :

Ajouter à la chaîne de caractères

( Parce que je suis frugal, je n'utiliserai que deux variables foo et a plutôt que de le réutiliser dans toute la réponse ;-)

a=2
a+=4
echo $a
24

Utilisation de la Question la syntaxe :

foo="Hello"
foo+=" World"
echo $foo
Hello World

fonctionnent bien !

Ajouter à un nombre

echo $a
24
((a+=12))
echo $a
36

Ajouter à un tableau

echo ${a[@]}
36
a+=(18)
echo ${a[@]}
36 18
echo ${a[0]}
36
echo ${a[1]}
18

printf : Reconstruire la variable en utilisant intégré commande

Le site printf intégré offre un moyen puissant de dessiner le format des chaînes de caractères. Comme il s'agit d'un bash intégré il existe une option permettant d'envoyer la chaîne formatée vers une variable au lieu de l'imprimer sur l'écran. stdout :

echo ${a[@]}
36 18

Il y a deux cordes (contenant uniquement des chiffres, mais des chaînes de caractères) dans ce tableau, de sorte que vous pourriez construire une chaîne de caractères formatée contenant au moins deux arguments positionnels :

printf -v a "%s./.%s" ${a[@]}
echo $a
36./.18

Utilisation de la Question la syntaxe :

foo="Hello"
printf -v foo "%s World" $foo
echo $foo
Hello World

Nota, l'utilisation de guillemets peut être utile pour manipuler des chaînes de caractères qui contiennent spaces , tabulations et/ou newlines

printf -v foo "%s World" "$foo"

coquille maintenant

Sous POSIX vous ne pouviez pas utiliser bashismes donc il n'y a pas de intégré printf .

En gros,

Mais vous pourriez simplement :

foo="Hello"
foo="$foo World"
echo $foo
Hello World

Formaté, utilisant fourche printf

Si vous voulez des constructions plus sophistiquées, vous devez utiliser une fourchette (nouveau processus enfant qui effectue le travail et renvoie le résultat par l'intermédiaire de stdout ) :

foo="Hello"
foo=$(printf "%s World" "$foo")
echo $foo
Hello World

Historiquement, vous pouviez utiliser backticks pour récupérer le résultat d'un fourchette :

foo="Hello"
foo=`printf "%s World" "$foo"`
echo $foo
Hello World

Mais ce n'est pas facile pour nidification :

foo="Today is: "
foo=$(printf "%s %s" "$foo" "$(date)")
echo $foo
Today is: Sun Aug 4 11:58:23 CEST 2013

avec des backticks, vous devez échapper aux fourches internes avec barres obliques inversées :

foo="Today is: "
foo=`printf "%s %s" "$foo" "\`date\`"`
echo $foo
Today is: Sun Aug 4 11:59:10 CEST 2013

7 votes

Le site += est également beaucoup plus rapide que l'opérateur $a="$a$b" dans mes tests.. Ce qui est logique.

10 votes

Cette réponse est géniale, mais je pense qu'il manque le var=${var}.sh exemple d'autres réponses, ce qui est très utile.

1 votes

Est bash le seul shell avec += opérateur ? Je veux voir s'il est assez portable

137voto

userend Points 678

Vous pouvez aussi le faire :

$ var="myscript"

$ echo $var

myscript

$ var=${var}.sh

$ echo $var

myscript.sh

5 votes

Si aucun caractère spécial ni espace n'est utilisé, les guillemets doubles, les guillemets et les crochets sont inutiles : var=myscript;var=$var.sh;echo $var aurait les mêmes effets (Cela fonctionne sous bash, dash, busybox et autres).

0 votes

@F.Hauri merci de l'avoir signalé. Mais si vous deviez ajouter un nombre, cela ne fonctionnerait pas : par ex. echo $var2 ne produit pas myscript2

0 votes

@Pynchia Ce travail à cause du point . illégal dans le nom de la variable. Si sinon echo ${var}2 ou voir ma réponse

124voto

orkoden Points 2262
bla=hello
laber=kthx
echo "${bla}ohai${laber}bye"

La sortie sera

helloohaikthxbye

Ceci est utile lorsque $blaohai conduit à une erreur de variable non trouvée.

3 votes

Ça ne marche pas. J'obtiens "backupstorefolder : command not found" de bash où "backupstorefolder" est le nom d'une variable.

7 votes

Cela facilite considérablement la mise en évidence de la syntaxe et supprime certaines ambiguïtés humaines.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X