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