在 PHP 中,字符串连接在一起如下:
$foo = "Hello";
$foo .= " World";
在这里, $foo
成为 “Hello World”。
如何在 Bash 中完成?
foo="Hello"
foo="$foo World"
echo $foo
> Hello World
通常,要连接两个变量,您可以一个接一个地编写它们:
a='hello'
b='world'
c=$a$b
echo $c
> helloworld
Bash 还支持 + = 运算符,如以下脚本所示:
$ A="X Y"
$ A+="Z"
$ echo "$A"
X YZ
由于这个问题专门针对Bash ,我的第一部分答案会提出不同的方法:
+=
:附加到变量语法+=
可以以不同的方式使用:
var+=...
(因为我节俭,我只会使用两个变量foo
和a
然后在整个答案中重复使用相同的。;-)
a=2
a+=4
echo $a
24
使用Stack Overflow 问题语法,
foo="Hello"
foo+=" World"
echo $foo
Hello World
工作正常!
((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
请注意,在括号之间,有一个空格分隔的数组 。如果要在数组中存储包含空格的字符串,则必须将它们括起来:
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
:使用builtin命令重构变量 printf
builtin命令提供了一种绘制字符串格式的强大方法。由于这是一个 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 下,当您在不指定索引的情况下访问变量名时,您始终只能查询第一个元素!
所以要检索我们的七个字段数组,我们只需要重新设置第一个元素:
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
注意:使用双引号可能对操作包含spaces
, tabulations
newlines
和 / 或newlines
字符串很有用
printf -v foo "%s World" "$foo"
在POSIX shell 下,你不能使用bashisms ,因此没有内置的 printf
。
但你可以这样做:
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