bash 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 :(得分:3)
在赋值中,括号只表示正在创建数组;这与使用括号作为复合命令无关。
但这不是推荐拆分字符串的方法。假设你有字符串
str="a * b"
arr=($str)
当扩展$str
时,该值经历了字拆分(这是允许数组具有多个元素的内容)和路径名扩展。您的数组现在将a
作为其第一个元素,b
作为其最后一个元素,但中间有一个或多个元素,具体取决于当前直接工作*
的文件数量。更好的解决方案是使用read
命令。
read -ra arr <<< "$str"
现在read
命令本身会分割$str
的值,而不会将路径名扩展应用于结果。
答案 1 :(得分:0)
看起来你很困惑
arr=($str) # An array is created with word-splitted str
与
(some command) # executing some command in a subshell
请注意
arr=($str)
与arr=("$str")
的不同之处在于,在后者中,双引号可防止分词,即数组只包含一个值 - &gt; a b c d e
。
您可以通过以下方式检查两者之间的差异
echo "${#arr[@]}"