在PHP中,字符串按如下方式连接在一起:

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

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

这是如何在Bash中实现的?


当前回答

尽管有特殊的运算符+=用于连接,但有一种更简单的方法:

foo='Hello'
foo=$foo' World'
echo $foo

双引号需要额外的计算时间来解释内部变量。如果可能,请避免。

其他回答

这里是对大多数答案的简要总结。

假设我们有两个变量,$1设置为“1”:

set one two
a=hello
b=world

下表说明了我们可以组合a和b的值来创建新变量c的不同上下文。

Context                               | Expression            | Result (value of c)
--------------------------------------+-----------------------+---------------------
Two variables                         | c=$a$b                | helloworld
A variable and a literal              | c=${a}_world          | hello_world
A variable and a literal              | c=$1world             | oneworld
A variable and a literal              | c=$a/world            | hello/world
A variable, a literal, with a space   | c=${a}" world"        | hello world
A more complex expression             | c="${a}_one|${b}_2"   | hello_one|world_2
Using += operator (Bash 3.1 or later) | c=$a; c+=$b           | helloworld
Append literal with +=                | c=$a; c+=" world"     | hello world

几点注意事项

将赋值的RHS括在双引号中通常是一种很好的做法,尽管在许多情况下它是可选的+如果以小增量构造大字符串,特别是在循环中,则从性能角度来看,=更好在变量名周围使用{}来消除扩展的歧义(如上表第2行所示)。如第3行和第4行所示,不需要{},除非变量与一个字符串连接,该字符串以shell变量名中有效的第一个字符(即字母或下划线)开头。


另请参见:

BashFAQ/013-如何连接两个变量?我们什么时候需要在外壳变量周围使用大括号?

我更喜欢使用花括号${}来扩展字符串中的变量:

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

卷曲括号将适合连续字符串用法:

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

否则,使用foo=“$fooWorld”将不起作用。

即使现在允许使用+=运算符,它也已在2004年的Bash 3.1中引入。

如果幸运的话,在较旧的Bash版本上使用此运算符的任何脚本都将失败,并显示“命令未找到”错误,或“语法错误接近意外标记”。

对于那些关心向后兼容性的人,请使用较旧的标准Bash连接方法,如所选答案中提到的方法:

foo="Hello"
foo="$foo World"
echo $foo
> Hello World
var1='hello'
var2='world'
var3=$var1" "$var2 
echo $var3
foo="Hello"
foo="${foo} World"
echo "${foo}"
> Hello World

通常,要连接两个变量,只需将它们一个接一个地写入即可:

a='Hello'
b='World'
c="${a} ${b}"
echo "${c}"
> Hello World