'读-ra' vs直接分配

时间:2014-12-04 14:47:55

标签: bash shell

在bash(版本3)脚本中,我想保存传递的命令行参数,以便我可以多次迭代它们(使用shift)并可能删除其中的一些。

根据我的理解,"$@"首先就像一个数组。

我的第一个冲动是写:
cmdArgs="$@"
然后像任何其他数组一样操纵cmdArgs

但是,我正在阅读许多使用另一种语法的答案:
read -ra cmdArgs <<<"$@"

为什么呢?第二种选择更长,不太明显,但似乎是首选。那为什么呢?

1 个答案:

答案 0 :(得分:6)

两者都不正确。两者都尝试正确使用"$@",但每个都在一个上下文中使用它,在这个上下文中,在您可以访问单个元素之前,将单词的结果列表折叠为单个空格分隔的字符串。

第一个将字符串分配给常规变量,而不是数组。

$ set "foo bar" baz
$ cmdArgs="$@"
$ printf "%s\n" "$cmdArgs"
foo bar baz

第二个使用<<<运算符,它只占用一个单词,因此read获取单个空格分隔的字符串并将其拆分为分隔列表,以便包含空格的参数被分成多个数组元素。

$ read -ra cmdArgs <<< "$@"
$ printf "%s\n" "${cmdArgs[@]}"
foo
bar
baz

正确的方法是

$ cmdArgs=( "$@" )
$ printf "%s\n" "${cmdArgs[@]}"
foo bar
baz