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,但之後會發生什麼?
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,但之後會發生什麼?
在賦值中,括號只是表示正在創建一個數組;這與使用括號作爲複合命令無關。
雖然這不是推薦的分割字符串的方法。假設你有串
str="a * b"
arr=($str)
當$str
擴大,價值都經歷字拆分(這是允許陣列具有多個元素)和路徑擴展。您的陣列現在將具有a
作爲其第一個元素,b
作爲它的最後一個元素,但它們之間有一個或多個元素,具體取決於當前工作的直接*
匹配的文件數量。更好的解決方案是使用read
命令。
read -ra arr <<< "$str"
現在read
命令本身分裂的$str
而不同時施加路徑擴展到結果的值。
看來你已經糊塗
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[@]}"
你怎麼想反斜槓兩者之間的差異進行處理?如果你有'a \ b c d e',第一個元素應該是'a b'還是''a'''? –