如何在Bash中链接字符串变量

在PHP中,字符串按如下方式串联在一块儿: shell

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

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

如何在Bash中完成? bash


#1楼

若是你正在尝试作的是一个字符串分解成几行,你能够用一个反斜杠: spa

$ a="hello\
> world"
$ echo $a
helloworld

中间有一个空格: code

$ a="hello \
> world"
$ echo $a
hello world

这两个之间也仅添加一个空格: server

$ a="hello \
>      world"
$ echo $a
hello world

#2楼

还有另外一种方法... 索引

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

...还有一个 进程

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

#3楼

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

将输出 ip

helloohaikthxbye

$blaohai致使变量未找到错误时,这颇有用。 或者,若是字符串中包含空格或其余特殊字符。 "${foo}"正确地转义了您放入其中的全部内容。 开发


#4楼

重击第一

正如这个问题专门表明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

请注意,括号之间有一个以空格分隔的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

注意:使用双引号可能对处理包含spacestabulations和/或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

#5楼

若是要附加下划线,请使用转义(\\)

FILEPATH=/opt/myfile

不起做用

echo $FILEPATH_$DATEX

这工做正常:

echo $FILEPATH\\_$DATEX
相关文章
相关标签/搜索