2015-01-09 57 views
1

當執行下面的代碼,輸出是我希望它是:創建陣列:在源直接文本VS字符串

$ foo=(a b "c d") && for p in "${foo[@]}"; do echo $p; done 
a 
b 
c d 

但是,當初始化來自一個字符串,例如像這個:

$ foo=($(echo "a b \"c d\"")) && for p in "${foo[@]}"; do echo $p; done 
a 
b 
"c 
d" 

所以輸出是不同的,而我期望這兩個命令做同樣的事情。爲什麼這兩種方法不相等,我如何才能得到初始化程序來自字符串的變體與直接初始化的工作方式相同?

+0

在第二種技術中,引號是純字符,而不是shell元字符。你需要在那裏混合一個'eval',這通常是不推薦的。 – 2015-01-09 21:19:25

+0

@glennjackman所以......你告訴我的答案是「你不能沒有shenanigans」嗎?另外...爲什麼這樣做呢? – Griwes 2015-01-09 21:19:57

+1

你相信傳入的字符串多少? 'str ='a b「c d」'; eval foo =($ str); printf「%s \ n」「$ {foo [@]}」' – 2015-01-09 21:20:46

回答

1

這裏有一個辦法:

str='a b "c d"' 
eval "foo=($str)" 
printf "%s\n" "${foo[@]}" 

我需要去洗澡了。