2011-10-14 54 views
0

由於IFS的默認值,我得到以下結果。linux shell腳本:忽略來自IFS的雙引號

STR="this is a \"valid string\"" 
for a in $STR; do 
    echo $a; 
done 

會給作爲輸出:

this 
is 
a 
"valid 
string" 

但我不想要分割 「有效的字符串」。 我需要的輸出:

this 
is 
a 
"valid string" 

那麼,如何才能讓殼忽略來自IFS雙引號?

+0

請正確格式化您的問題! – jman

+0

對不起。我是新的stackoverflow。現在完成。 – sachinpkale

回答

0

這並不容易。您可以切換到Perl。或者,如果你有超過字符串的完全控制,沒有人能可能是有史以來插入一些邪入它,你可以使用此代碼:

str="a b c \"d e\"" 
eval "set args $str; shift" 

for i in "[email protected]"; do 
    echo "$i" 
done 

這將輸出的最後一個字不帶引號,但。它會將命令lune參數覆蓋到shell程序本身。

如果您需要保留引號,這稱爲解析,不應該由shell程序完成,因爲它變得太複雜了。

2

引號有兩種類型:文字和句法。 STR的外部引號是句法的,這意味着它們實際上並不是字符串的一部分,它們只是用來告訴Bash字符串開始和結束的位置。內部(轉義)引號是文字,因此它們是字符串的一部分。換句話說,你的字符串的字面值:

this is a "valid string" 

現在如果你想遍歷這個,你要記住這串由五個(空間分隔)文字的話:

this 
is 
a 
"valid 
string" 

如果要解決這個問題,一個既可以使用eval(但嚴重security issues謹防)或數組:

declare -a STR=(this is a "valid string") 
for str in "${STR[@]}" 
do 
    echo "$str" 
done