如何连接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+=...

(因为我很节俭,我只会使用两个变量fooa ,然后在整个答案中重复使用它们。;-)

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 world41')

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

注意:使用双引号对于处理包含spacestabulations 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

上一篇: How to concatenate string variables in Bash

下一篇: Determine installed PowerShell version