在PHP中,字符串按如下方式连接在一起:

$foo = "Hello";
$foo .= " World";

在这里,$foo变成了“Hello World”。

这是如何在Bash中实现的?


当前回答

如果要附加下划线之类的内容,请使用转义符(\)

FILEPATH=/opt/myfile

这不起作用:

echo $FILEPATH_$DATEX

这很好:

echo $FILEPATH\\_$DATEX

其他回答

还有一种方法。。。

> H="Hello "
> U="$H""universe."
> echo $U
Hello universe.

…还有另一个。

> H="Hello "
> U=$H"universe."
> echo $U
Hello universe.

先猛击

由于这个问题特别适用于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

嗯。这不是一个bug,而是一个功能。。。防止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

注意:使用双引号可能有助于处理包含空格、制表符和/或换行符的字符串

printf -v foo "%s World" "$foo"

立即启动Shell

在POSIX shell下,不能使用bashms,因此没有内置printf。

大体上

但你可以简单地做到:

foo="Hello"
foo="$foo World"
echo $foo
Hello World

格式化,使用分叉打印

如果要使用更复杂的构造,必须使用fork(生成作业并通过stdout返回结果的新子进程):

foo="Hello"
foo=$(printf "%s World" "$foo")
echo $foo
Hello World

从历史上看,您可以使用倒钩来检索fork的结果:

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

我更喜欢使用花括号${}来扩展字符串中的变量:

foo="Hello"
foo="${foo} World"
echo $foo
> Hello World

卷曲括号将适合连续字符串用法:

foo="Hello"
foo="${foo}World"
echo $foo
> HelloWorld

否则,使用foo=“$fooWorld”将不起作用。

foo="Hello "
foo="$foo World"

     

bla=hello
laber=kthx
echo "${bla}ohai${laber}bye"

将输出

helloohaikthxbye

当$blaohai美元导致变量未找到错误。或者如果字符串中有空格或其他特殊字符。“${foo}”正确地转义您放入其中的任何内容。