如何在Bash中连接字符串变量?

bash shell syntax concat string-concatenation


在PHP中,字符串的连接方式如下。

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

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

在Bash中是如何实现的?




Answer 1 codaddict


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

一般来说,要把两个变量连起来,你可以把它们一个接一个地写出来。

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



Answer 2 thkala


Bash还支持 += 运算符,如以下代码所示:

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



Answer 3 F. Hauri


首先是Bash

正如这个问题专门代表Bash一样,我的答案的第一部分将提出正确执行此操作的不同方法:

+= :追加到变量

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

附加到字符串 var+=...

(因为我很节俭,所以我只会使用两个变量 fooa ,然后在整个答案中重复使用相同的变量。

a=2
a+=4
echo $a
24

使用堆栈溢出问题语法,

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

works fine!

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

变量 a 是字符串,也是整数

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

请注意,括号之间有一个以空格分隔的array。如果要在数组中存储包含空格的字符串,则必须将它们括起来:

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

嗯.. 这不是一个bug,而是一个功能 ...为了防止bash尝试开发 !" ,您可以:

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 :使用内置命令重建变量

内置printf 命令提供了一种强大的绘制字符串格式的方式。由于这是Bash 内置的,因此可以选择将格式化的字符串发送到变量,而不是在 stdout 上打印:

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

此数组中有七个字符串。因此,我们可以构建一个格式化的字符串,其中包含恰好七个位置参数:

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

或者我们可以使用一个参数格式字符串,该字符串将与提交的许多参数重复...

请注意,我们的 a 仍然是数组!仅第一个元素被更改!

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!")'

在bash下,当你访问一个没有指定索引的变量名时,你总是只访问第一个元素!

所以要检索我们的7个字段数组,我们只需要重新设置第1个元素。

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!")'

一个参数格式字符串,有很多参数传递给。

printf -v a[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 字符串很有用

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

壳牌现在

POSIX shell下,您不能使用bashisms,因此没有内置的 printf

Basically

但你可以简单地做。

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

格式化,使用分叉的 printf

如果您想使用更复杂的构造,则必须使用fork(新的子进程进行工作并通过 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



Answer 4 userend


你也可以这样做。

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh



Answer 5 orkoden


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

将输出

helloohaikthxbye

$blaohai 导致变量未找到错误时,这很有用 。或者,如果字符串中包含空格或其他特殊字符。 "${foo}" 正确地转义了您放入其中的所有内容。