如何连接Bash中的stringvariables?

在PHP中,string连接在一起,如下所示:

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

在这里, $foo变成了“Hello World”。

这在Bash中是如何完成的?

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

一般来说,要连接两个variables,你可以把它们一个接一个地写出来:

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

Bash也支持+ =运算符,如下面的logging所示:

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

首先打

由于这个问题特别针对Bash ,我的答案的第一部分将以不同的方式正确地做到这一点:

+= :追加到variables

语法+=可以以不同的方式使用:

附加到stringvar+=...

(因为我很节俭,所以我只会使用两个variablesfooa ,然后在整个答案中重复使用.-)

 a=2 a+=4 echo $a 24 

使用堆栈溢出问题语法,

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

工作正常!

追加到一个整数((var+=...))

variablesa是一个string,也是一个整数

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

附加到数组var+=(...)

我们的a也是一个元素的数组。

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

请注意,在圆括号之间,有一个空格分隔的数组 。 如果你想在你的数组中存储一个包含空格的string,你必须把它们包含在内:

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

嗯.. 这不是一个错误,而是一个function …为了防止bash试图发展!" ,你可以:

 a+=(one word "hello world"! 'hello world!' $'hello world\041') declare -pa declare -aa='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="h ello world!" [6]="hello world!")' 

printf :使用内build命令重新构造variables

printf 内置命令提供了一种绘制string格式的强大方法。 由于这是一个Bash 内build的 ,所以可以select将格式化的string发送到variables而不是在stdout上打印:

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

这个数组中有七个string 。 所以我们可以build立一个包含七个位置参数的格式化string:

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

或者我们可以使用一个参数格式的string,这将重复许多参数submited …

请注意,我们的a仍然是一个数组! 只有第一个元素被改变了!

 declare -pa declare -aa='([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!")' 

在bash下,当你访问一个variables名而不指定索引时,你总是只处理第一个元素!

所以要检索我们的七场数组,我们只需要重新设置1st元素:

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

一个带有许多参数的参数格式string传递给:

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

使用堆栈溢出问题语法:

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

注意:使用双引号可能对于处理包含spacestabulations newlines和/或newlinesstring很有用

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

现在壳牌

POSIX shell下,你不能使用bashisms ,所以没有内置的 printf

基本上

但是你可以简单地做:

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

格式化,使用分叉的 printf

如果你想使用更复杂的结构,你必须使用一个分支 (新的subprocess来完成这个工作,并通过stdout返回结果):

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

从历史上看,你可以使用反引号检索fork的结果:

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

但是嵌套不容易:

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

用反引号,你必须用反斜线逃避内叉:

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

你也可以这样做:

 $ var="myscript" $ echo $var myscript $ var=${var}.sh $ echo $var myscript.sh 
 bla=hello laber=kthx echo "${bla}ohai${laber}bye" 

会输出

 helloohaikthxbye 

$blaohai导致一个variables未发现的错误时,这是​​有用的。 或者如果您的string中有空格或其他特殊字符。 "${foo}"正确地逃脱了你放入它的任何东西。

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

我想解决问题的方法就是这样

 $a$b 

例如,

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

生产

 Hello World 

例如,如果尝试连接另一个string的string,

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

那么echo "$c"就会产生

 Hello World 

有一个额外的空间。

 $aWorld 

不像你想象的那样工作,但是

 ${a}World 

产生

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

又一种方法…

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

…还有另一个。

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

如果你想附加下划线,使用escape(\)

 FILEPATH=/opt/myfile 

这不起作用:

 echo $FILEPATH_$DATEX 

这工作正常:

 echo $FILEPATH\\_$DATEX 

你可以连接而不用引号。 这里是一个例子:

 $Variable1 Open $Variable2 Systems $Variable3 $Variable1$Variable2 $echo $Variable3 

最后一条语句将打印“OpenSystems”(不含引号)。

这是一个Bash脚本的例子:

 v1=hello v2=world v3="$v1 $v2" echo $v3 # Output: hello world echo "$v3" # Output: hello world 

即使+ =运算符现在被允许,它在2004年被引入Bash 3.1

如果你幸运的话,任何在旧Bash版本上使用这个操作符的脚本都会失败,并且会出现“找不到命令”的错误,或者出现“意外标记附近的语法错误”。

对于那些关心向后兼容性的人来说,坚持使用旧的标准Bash连接方法,就像select的答案中提到的那样:

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

我更喜欢使用大括号${}来扩展string中的variables:

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

大括号将适合连续string的用法:

 foo="Hello" foo="${foo}World" echo $foo > HelloWorld 

否则使用foo = "$fooWorld"将不起作用。

更安全的方式:

 a="AAAAAAAAAAAA" b="BBBBBBBBBBBB" c="CCCCCCCCCCCC" d="DD DD" s="${a}${b}${c}${d}" echo "$s" AAAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCDD DD 

包含空格的string可以成为命令的一部分,使用“$ XXX”和“$ {XXX}”来避免这些错误。

另外看看关于+ =的其他答案

有一个特别的情况,你应该保重:

 user=daniel cat > output.file << EOF "$user"san EOF 

将输出"daniel"san danielsan ,而不是danielsan ,你可能会想要的。 在这种情况下,你应该这样做:

 user=daniel cat > output.file << EOF ${user}san EOF 

如果你想要做的是一个string分成几行,你可以使用反斜杠:

 $ a="hello\ > world" $ echo $a helloworld 

在一个空间之间:

 $ a="hello \ > world" $ echo $a hello world 

这个也只增加了一个空间:

 $ a="hello \ > world" $ echo $a hello world 

如果它是你添加" World"到原始string的例子,那么它可以是:

 #!/bin/bash foo="Hello" foo=$foo" World" echo $foo 

输出:

 Hello World 

最简单的方式用引号:

 B=Bar b=bar var="$B""$b""a" echo "Hello ""$var" 
 var1='hello' var2='world' var3=$var1" "$var2 echo $var3 

请注意,这是行不通的

 foo=HELLO bar=WORLD foobar=PREFIX_$foo_$bar 

因为它似乎放弃$ foo并留下:

PREFIX_WORLD

但是这将工作:

 foobar=PREFIX_"$foo"_"$bar" 

并留下正确的输出:

PREFIX_HELLO_WORLD

我这样做的时候方便:使用内联命令!

 echo "The current time is `date`" echo "Current User: `echo $USER`" 

这是通过AWK的一个:

 $ foo="Hello" $ foo=$(awk -v var=$foo 'BEGIN{print var" World"}') $ echo $foo Hello World 

我有点喜欢做一个快速的function。

 #! /bin/sh -f function combo() { echo $@ } echo $(combo 'foo''bar') 

还有另一种方法来剥皮猫。 这次与function:D

你可以尝试下面的方法。 当replace发生时,双引号将保留空格。

 var1="Ram " var2="Lakshmana" echo $var1$var2 or echo var1+=$var2 "bash support += operation. bcsmc2rtese001 [/tmp]$ var1="Ram " bcsmc2rtese001 [/tmp]$ var2="Lakshmana" bcsmc2rtese001 [/tmp]$ echo $var1$var2 Ram Lakshmana bcsmc2rtese001 [/tmp]$ var1+=$var2 bcsmc2rtese001 [/tmp]$ echo $var1 Ram Lakshmana