问题:
在 PHP 中,字符串按如下方式连接在一起:
$foo = "Hello";
$foo .= " World";
在这里,$foo
变成了 "Hello World"
。
在 Bash 中如何实现这一点?
回答1:
foo="Hello"
foo="${foo} World"
echo "${foo}"
> Hello World
一般来说,要连接两个变量,你可以将它们一个接一个地写:
a='Hello'
b='World'
c="${a} ${b}"
echo "${c}"
> Hello World
回答2:
由于这个问题是专门针对 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[@]}
> 36a+=(18)echo ${a[@]}
> 36 18
echo ${a[0]}
> 36
echo ${a[1]}
> 18
请注意,括号之间有一个空格分隔的数组。如果要在数组中存储包含空格的字符串,则必须将它们括起来:
a+=(one word "hello world!" )
printf
:使用内置命令重新构造变量
printf
内置命令提供了一种强大的绘制字符串格式的方法。由于这是一个 Bash 内置程序,因此可以选择将格式化字符串发送到变量,而不是在 stdout
上打印:
echo ${a[@]}
> 36 18 one word hello world!
这个数组中有五个字符串。因此,我们可以构建一个包含五个位置参数的格式化字符串:
printf -v a "%s./.%s...'%s' '%s', '%s'" "${a[@]}"
echo $a
> 36./.18...'one' 'word', 'hello world!'
或者,我们可以使用一个参数格式字符串,该字符串将随着提交的参数数量而重复 …
请注意,我们的 a
仍然是一个数组!只有第一个元素改变了!
declare -p a
> declare -a a=([0]="36./.18...'one' 'word', 'hello world!'" [1]="18" [2]="one" [3]="word" [4]="hello world!")
在 bash 下,当你在不指定索引的情况下访问变量名时,你总是只寻址第一个元素!
因此,要找回我们的五字段数组,我们只需要重新设置第一个元素:
a=36
declare -p a
> declare -a a=([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!")
使用 Stack Overflow 的问题语法:
foo="Hello"
printf -v foo "%s World" $foo
echo $foo
> Hello World
注意: 双引号在处理包含空格、制表符和/或换行符的字符串时很有用
printf -v foo "%s World" "$foo"
参考:
- stackoverflow question 4181703
- help printf
- help declare
相关阅读:
- sh和Bash的区别
- 2>&1是什么意思
- 为什么我不能在脚本中使用“cd“来更改目录
- 如何使用bash脚本并行运行多个程序
- 为什么要使用xargs命令
- xargs命令用法实例