Question Comment concaténer des variables de chaîne dans Bash


En PHP, les chaînes sont concaténées ensemble comme suit:

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

Ici, $foo devient "Hello World".

Comment cela est-il accompli dans Bash?


2095
2017-11-15 05:38


origine


Réponses:


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

En général, pour concaténer deux variables, vous pouvez les écrire les unes après les autres:

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

2842
2017-11-15 05:41



Bash prend également en charge un opérateur + = comme indiqué dans la transcription suivante:

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

933
2017-11-15 08:33



Bash premier

Comme cette question est spécifique à Frapper, ma première partie de la réponse présenterait différentes façons de le faire correctement:

+=: Ajouter à la variable

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

Ajouter à la chaîne var+=...

(Parce que je suis frugal, je n'utiliserai que deux variables foo et a puis réutiliser la même chose dans toute la réponse. ;-)

a=2
a+=4
echo $a
24

En utilisant le Stack Overflow question syntaxe,

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

fonctionne bien!

Ajouter à un nombre entier ((var+=...))

variable a est une chaîne, mais aussi un nombre entier

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

Ajouter à un tableau var+=(...)

Notre a est également un tableau d'un seul élément.

echo ${a[@]}
36

a+=(18)

echo ${a[@]}
36 18
echo ${a[0]}
36
echo ${a[1]}
18

Notez que entre parenthèses, il y a un espace séparé tableau. Si vous voulez stocker une chaîne contenant des espaces dans votre tableau, vous devez les inclure:

a+=(one word "hello world!" )
bash: !": event not found

Hmm .. ce n'est pas un bug, mais une fonctionnalité... Pour empêcher bash d'essayer de développer !", vous pourriez:

a+=(one word "hello world"! 'hello world!' $'hello world\041')

declare -p a
declare -a a='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="h
ello world!" [6]="hello world!")'

printf: Reconstruire la variable en utilisant le intégré commander

le printf  intégré commande donne un moyen puissant de dessiner le format de chaîne. Comme c'est un Bash intégré, il y a une option pour envoyer une chaîne formée à une variable au lieu d'imprimer sur stdout:

echo ${a[@]}
36 18 one word hello world! hello world! hello world!

Ils sont sept cordes dans ce tableau. Nous pouvons donc construire une chaîne formalisée contenant exactement sept arguments positionnels:

printf -v a "%s./.%s...'%s' '%s', '%s'=='%s'=='%s'" "${a[@]}"
echo $a
36./.18...'one' 'word', 'hello world!'=='hello world!'=='hello world!'

Ou nous pourrions utiliser chaîne de format d'un argument qui sera répété autant d'arguments soumis ...

Notez que notre a est toujours un tableau! Seul le premier élément est changé!

declare -p a
declare -a a='([0]="36./.18...'\''one'\'' '\''word'\'', '\''hello world!'\''=='\
''hello world!'\''=='\''hello world!'\''" [1]="18" [2]="one" [3]="word" [4]="hel
lo world!" [5]="hello world!" [6]="hello world!")'

Sous bash, lorsque vous accédez à un nom de variable sans spécifier d'index, vous adressez toujours le premier élément uniquement!

Donc, pour récupérer notre tableau de sept champs, nous avons seulement besoin de re-définir le 1er élément:

a=36
declare -p a
declare -a a='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="he
llo world!" [6]="hello world!")'

Une chaîne de format d'argument avec de nombreux arguments passés à:

printf -v a[0] '<%s>\n' "${a[@]}"
echo "$a"
<36>
<18>
<one>
<word>
<hello world!>
<hello world!>
<hello world!>

En utilisant le Stack Overflow question syntaxe:

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

Nota: L'utilisation de double citation peut être utile pour manipuler des chaînes contenant spaces, tabulations et / ou newlines

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

Shell maintenant

En dessous de POSIX shell, vous ne pouviez pas utiliser les bashismes, donc il n'y a pas intégré  printf.

Fondamentalement

Mais vous pouvez simplement faire:

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

Formaté, en utilisant à bifurcation  printf

Si vous voulez utiliser des constructions plus sophistiquées, vous devez utiliser un fourchette (nouveau processus enfant qui fait le travail et renvoie le résultat via stdout):

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

Historiquement, vous pouviez utiliser dos 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 à la fourche intérieure avec antislash:

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

803
2017-08-04 10:04



Vous pouvez le faire aussi:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

114
2017-10-28 03:09



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

Sortira

helloohaikthxbye

Ceci est utile quand      $blaohai conduit à une variable non trouvée erreur. Ou si vous avez des espaces ou d'autres caractères spéciaux dans vos chaînes. "${foo}" échappe correctement tout ce que vous y mettez.


103
2017-07-25 15:48



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


35
2017-11-15 05:44



La façon dont je résoudrais le problème est juste

$a$b

Par exemple,

a="Hello"
b=" World"
c=$a$b
echo "$c"

qui produit

Hello World

Si vous essayez de concaténer une chaîne avec une autre chaîne, par exemple,

a="Hello"
c="$a World"

puis echo "$c" produira

Hello World

avec un espace supplémentaire.

$aWorld

ne fonctionne pas, comme vous pouvez l'imaginer, mais

${a}World

produit

HelloWorld

29
2018-03-07 16:43



$ a=hip
$ b=hop
$ ab=$a$b
$ echo $ab
hiphop
$ echo $a$b
hiphop

22
2017-11-15 05:42



Encore une autre approche ...

> H="Hello "
> U="$H""universe."
> echo $U
Hello universe.

... et encore un autre.

> H="Hello "
> U=$H"universe."
> echo $U
Hello universe.

18
2018-03-18 08:24



Si vous voulez ajouter quelque chose comme un trait de soulignement, utilisez escape (\)

FILEPATH=/opt/myfile

Cela fait ne pas travail:

echo $FILEPATH_$DATEX

Cela fonctionne bien:

echo $FILEPATH\\_$DATEX

18
2017-09-20 19:15