在PHP中,字符串按如下方式串联在一块儿: shell
$foo = "Hello"; $foo .= " World";
在这里, $foo
变成“ Hello World”。 数组
如何在Bash中完成? bash
若是你正在尝试作的是将一个字符串分解成几行,你能够用一个反斜杠: spa
$ a="hello\ > world" $ echo $a helloworld
中间有一个空格: code
$ a="hello \ > world" $ echo $a hello world
这两个之间也仅添加一个空格: server
$ a="hello \ > world" $ echo $a hello world
还有另外一种方法... 索引
> H="Hello " > U="$H""universe." > echo $U Hello universe.
...还有一个 进程
> H="Hello " > U=$H"universe." > echo $U Hello universe.
bla=hello laber=kthx echo "${bla}ohai${laber}bye"
将输出 ip
helloohaikthxbye
当$blaohai
致使变量未找到错误时,这颇有用。 或者,若是字符串中包含空格或其余特殊字符。 "${foo}"
正确地转义了您放入其中的全部内容。 开发
正如这个问题专门表明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
请注意,括号之间有一个以空格分隔的array 。 若是要在数组中存储包含空格的字符串,则必须将它们括起来:
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
注意:使用双引号可能对处理包含spaces
, tabulations
和/或newlines
字符串颇有用
printf -v foo "%s World" "$foo"
在POSIX shell下,您不能使用bashisms ,所以没有内置的 printf
。
可是您能够简单地执行如下操做:
foo="Hello" foo="$foo World" echo $foo Hello World
printf
若是您想使用更复杂的结构,则必须使用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
若是要附加下划线,请使用转义(\\)
FILEPATH=/opt/myfile
这不起做用 :
echo $FILEPATH_$DATEX
这工做正常:
echo $FILEPATH\\_$DATEX