如何连接Bash中的字符串变量
在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] '<%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
如果你想使用更复杂的结构,你必须使用一个分支(新的子进程来完成这个工作,并通过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