在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