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 ?
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 ?
C'est probablement une bonne chose de prendre l'habitude de mettre $foo
entre guillemets, pour les moments où cela compte vraiment.
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.
Doit-il y avoir un espace dans votre premier exemple ? Est-il possible de faire quelque chose comme foo="$fooworld"
? Je suppose que non...
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 ?
@levesque : Les deux :-). Les variables ne doivent être exportées qu'une seule fois, mais export A+=Z
fonctionne également très bien.
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.
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 variableLa syntaxe +=
peuvent être utilisés de différentes maniè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 !
echo $a
24
((a+=12))
echo $a
36
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é commandeLe 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"
Sous POSIX vous ne pouviez pas utiliser bashismes donc il n'y a pas de intégré printf
.
Mais vous pourriez simplement :
foo="Hello"
foo="$foo World"
echo $foo
Hello World
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
Le site +=
est également beaucoup plus rapide que l'opérateur $a="$a$b"
dans mes tests.. Ce qui est logique.
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.
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).
@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
@Pynchia Ce travail à cause du point .
illégal dans le nom de la variable. Si sinon echo ${var}2
ou voir ma réponse
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.
13 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 ?
2 votes
@Adi
foo1="World" foo2="Hello" foo3="$foo1$foo2"
2 votes
Les espaces ont une importance dans bash)
1 votes
Pour donner un exemple d'insertion dans une chaîne de caractères, faire
echo "sh ${HOME}/ultimate-utils/run_tb.sh"