在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
使用堆栈溢出问题语法,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
嗯..这不是一个错误,而是一个功能......为了防止bash试图发展!" ,你可以:a+=(one word "hello world"! 'hello world!' $'hello world 41')
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!
这个数组中有七个字符串。 所以我们可以构建一个包含7个位置参数的格式化字符串:printf -v a "%s./.%s...'%s' '%s', '%s'=='%s'=='%s'" "${a[@]}"
echo $a
36./.18...'one' 'word', 'hello world!'=='hello world!'=='hello world!'
或者我们可以使用一个参数格式字符串,这将重复许多参数submited ...
请注意,我们的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下,当你访问一个变量名而不指定索引时,你总是只处理第一个元素!
所以要检索我们的七场数组,我们只需要重新设置1st元素: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] 'n' "${a[@]}"
echo "$a"
<36>
<18>
使用堆栈溢出问题语法: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
如果你想使用更复杂的结构,你必须使用一个分支(新的子进程来完成这个工作,并通过stdout返回结果):foo="Hello"
foo=$(printf "%s World" "$foo")
echo $foo
Hello World
从历史上看,您可以使用反引号检索分叉的结果: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
链接地址: http://www.djcxy.com/p/761.html