2014-03-03 102 views
0

在Linux bash中有很多關於IFS字符串拆分和單引號轉義的回答問題,但是我沒有發現任何加入這兩個主題的答案。在蹣跚問題我得到像一個在這裏下面的代碼的奇怪(我)行爲:在單引號中使用IFS的Linux bash字符串拆分

(bash腳本塊)

theString="a string with some 'single' quotes in it" 

old_IFS=$IFS 
IFS=\' 
read -a stringTokens <<< "$theString" 
IFS=$old_IFS 

for token in ${stringTokens[@]} 
do 
    echo $token 
done 

# let's say $i holds the piece of string between quotes 
echo ${stringTokens[$i]} 

會發生什麼事是,呼應 -ed元該數組實際上包含我需要的子串(因此導致我認爲IFS是正確的),而for循環返回空格上的字符串split。

有人可以幫助我理解爲什麼相同的數組(或我腦子裏看起來像是同一個數組)的行爲如何?

回答

1

當你這樣做:

for token in ${stringTokens[@]} 

循環實際上就變成了:

for token in a string with some single quotes in it 

for循環不解析數組元素明智的,但它解析分隔字符串的整個輸出空間。

而是嘗試:

for token in "${stringTokens[@]}"; 
do 
    echo "$token" 
done 

這將等同於:

for token in "in a string with some " "single" " quotes in it" 

輸出在我的電腦:

a string with some 
single 
quotes in it 

檢查了這一點爲更多的bash陷阱: http://mywiki.wooledge.org/BashPitfalls