在PHP中,字符串连接在一起如下:
$foo = "Hello";
$foo .= " World";
这里, $foo
成为“Hello World”。
如何在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
由于这个问题专门针对 巴什,我的答案的第一部分将提出不同的方法来做到这一点:
+=
:附加到变量语法 +=
可以以不同的方式使用:
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
嗯.. 这不是一个错误,而是一个功能...防止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
:使用。重构变量 内置 命令该 printf
内置 命令提供了一种绘制字符串格式的强大方法。因为这是一个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
Nota:使用 双引号 可能对操作包含的字符串很有用 spaces
, tabulations
和/或 newlines
printf -v foo "%s World" "$foo"
下 POSIX shell,你无法使用 bash化所以没有 内置 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
你也可以这样做:
$ var="myscript"
$ echo $var
myscript
$ var=${var}.sh
$ echo $var
myscript.sh
bla=hello
laber=kthx
echo "${bla}ohai${laber}bye"
会输出
helloohaikthxbye
这很有用
$blaohai
导致变量未找到错误。或者如果字符串中有空格或其他特殊字符。 "${foo}"
妥善逃脱你投入的任何东西。
foo="Hello "
foo="$foo World"
我解决问题的方法就是
$a$b
例如,
a="Hello"
b=" World"
c=$a$b
echo "$c"
哪个产生
Hello World
例如,如果您尝试将字符串与另一个字符串连接起来,
a="Hello"
c="$a World"
然后 echo "$c"
会产生
Hello World
有一个额外的空间。
$aWorld
你可能想象不起作用,但是
${a}World
产生
HelloWorld
$ a=hip
$ b=hop
$ ab=$a$b
$ echo $ab
hiphop
$ echo $a$b
hiphop
又一种方法......
> H="Hello "
> U="$H""universe."
> echo $U
Hello universe.
......还有一个。
> H="Hello "
> U=$H"universe."
> echo $U
Hello universe.