如何在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
相關文章
相關標籤/搜索