2016-08-16 37 views
0

bash shell腳本可以將給定的字符串按空間拆分爲1D數組。Shell腳本按空格分割字符串

str="a b c d e" 
arr=($str) 

# arr[0] is a, arr[1] is b, etc. arr is now an array, but what is the magic behind? 

但是,究竟發生了什麼,當我們可以arr=($str)?我的理解是這裏的括號創建了一個子shell,但之後會發生什麼?

+0

你怎麼想反斜槓兩者之間的差異進行處理?如果你有'a \ b c d e',第一個元素應該是'a b'還是''a'''? –

回答

2

在賦值中,括號只是表示正在創建一個數組;這與使用括號作爲複合命令無關。

雖然這不是推薦的分割字符串的方法。假設你有串

str="a * b" 
arr=($str) 

$str擴大,價值都經歷字拆分(這是允許陣列具有多個元素)和路徑擴展。您的陣列現在將具有a作爲其第一個元素,b作爲它的最後一個元素,但它們之間有一個或多個元素,具體取決於當前工作的直接*匹配的文件數量。更好的解決方案是使用read命令。

read -ra arr <<< "$str" 

現在read命令本身分裂的$str而不同時施加路徑擴展到結果的值。

+0

'<<<'是'read'的特殊操作嗎? – Jes

+2

它不是特定於'read';這是一個特殊的重定向操作符。 'read'從標準輸入中獲取輸入。而'read chepner

+0

可能希望'read -r -a',除非OP明確地想要反斜槓影響分組。 –

0

看來你已經糊塗

arr=($str) # An array is created with word-splitted str 

(some command) # executing some command in a subshell 

注意

arr=($str)不同於arr=("$str")在後者中,雙引號防止字分裂即數組將只包含一個值 - >a b c d e

您可以檢查以下

echo "${#arr[@]}"