'读-ra'与直接分配

Sla*_*lav 3 bash shell

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

据我所知,它"$@"首先就像一个数组.

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

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

为什么?第二种选择更长,不太明显,但似乎是首选.所以为什么?

che*_*ner 6

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

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

$ set "foo bar" baz
$ cmdArgs="$@"
$ printf "%s\n" "$cmdArgs"
foo bar baz
Run Code Online (Sandbox Code Playgroud)

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

$ read -ra cmdArgs <<< "$@"
$ printf "%s\n" "${cmdArgs[@]}"
foo
bar
baz
Run Code Online (Sandbox Code Playgroud)

正确的方法是

$ cmdArgs=( "$@" )
$ printf "%s\n" "${cmdArgs[@]}"
foo bar
baz
Run Code Online (Sandbox Code Playgroud)