Shell 脚本按 space 拆分字符串

Shell script split a string by space

bash shell 脚本可以将给定的字符串 space 拆分为一维数组。

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) 时究竟发生了什么?我的理解是这里的括号创建了一个subshell,但是之后会发生什么?

在赋值中,括号只是表示正在创建一个数组;这与使用括号作为复合命令无关。

不过,这不是拆分字符串的推荐方法。假设你有字符串

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