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

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

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

这是如何在Bash中实现的?


当前回答

我解决问题的方法是

$a$b

例如

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

它产生

Hello World

例如,如果尝试将一个字符串与另一个字符串连接,

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

则echo“$c”将产生

Hello World

具有额外的空间。

$aWorld

不起作用,正如你所想象的,但是

${a}World

生产

HelloWorld

其他回答

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

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

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

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

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

如果您要做的是将字符串拆分为多行,则可以使用反斜杠:

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

中间有一个空格:

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

此选项还只在两者之间添加一个空格:

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

在我看来,连接两个字符串的最简单方法是编写一个函数,然后使用该函数。

function concat ()
{
    prefix=$1
    suffix=$2

    echo "${prefix}${suffix}"
}

foo="Super"
bar="man"

concat $foo $bar   # Superman

alien=$(concat $foo $bar)

echo $alien        # Superman

默认情况下,Bash中的变量和数组(索引或关联*)始终是字符串,但可以在声明内置函数中使用标志,为它们提供“integer”(-i)或“reference”**(-n)等属性,从而改变它们的行为方式。

Bash算术接受ASCII/字符串数字作为输入,因此实际使用integer属性的原因很少。

此外,变量值不能包含ASCII NULL(即8位零),因为通常使用以空结尾的C字符串来实现它们。

*即一个或多个键+值对。**参考变量扩展为另一个变量的值,其标签被分配给参考变量

附加字符串:

$ foo=Hello
$ foo+=' world!'
$ echo "$foo"

Hello world!

$ num=3
$ num+=4
echo "$num"

34 # Appended string (not a sum)

使用整数属性的原因之一是它改变了+=赋值运算符的行为:

$ declare -i num=3
$ num+=4
echo "$num"

7 # Sum

请注意,这不适用于-=、/=等,除非在算术((())和$(()()))中执行,在算术中,使用或不使用整数属性时,数字已被视为相同。有关这些运算符的完整列表,请参见manbash的“算术求值”一节,这些运算符与C相同。

+=赋值运算符也可用于将新元素附加到索引数组(AKA“列表”):

$ foo=(one)
$ foo+=(two)
$ printf 'Separate element: %s\n' "${foo[@]}"

Separate element: one
Separate element: two

另一种常见的方法是使用计数器:

$ foo[c++]=one
$ foo[c++]=two

POSIX shell不使用+=赋值运算符来附加字符串,因此必须这样做:

$ foo=Hello
$ foo="$foo world!"
$ echo "$foo"

Hello world!

这在Bash中也很好,因此它可以被认为是一种更可移植的语法。

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

假设我们有两个变量,$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-如何连接两个变量?我们什么时候需要在外壳变量周围使用大括号?