在bash(版本3)脚本中,我想保存传递的命令行参数,以便我可以多次迭代它们(使用shift)并可能删除其中的一些。
根据我的理解,"$@"
首先就像一个数组。
我的第一个冲动是写:
cmdArgs="$@"
然后像任何其他数组一样操纵cmdArgs
。
但是,我正在阅读许多使用另一种语法的答案:
read -ra cmdArgs <<<"$@"
为什么呢?第二种选择更长,不太明显,但似乎是首选。那为什么呢?
答案 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