Shell脚本按空格

时间:2016-08-16 15:50:42

标签: arrays bash shell subshell

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,但之后会发生什么?

2 个答案:

答案 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[@]}"