Bash 使用“$@”时脚本无法识别“-n”参数

Bash "-n" argument not recognized by script when using "$@"

我正在使用 bash 脚本,该脚本要求命令行参数以破折号开头,后跟文件名:

./script -abc file_name

在脚本中,我尝试打印出脚本的所有参数:

echo "$@"

其中显示:

-abc file_name

这是意料之中的。除了我单独使用字母 "n" 之外,其他一切都可以正常打印,即:

./script -n file_name

脚本中生成的 echo 语句仅打印出 file_name 参数,根本不打印“-n”参数。只有字母 "n" 本身才会出现此行为。当我尝试使用“-nx”或 'n' 与任何其他字母时,echo 语句打印得很好...

为什么这个 echo 语句不能单独使用“-n”?

-n-eecho 命令的有效选项。

因此它被 echo 命令消耗并且只显示剩余的文本。
这是 echo 的一个已知问题,要避免这种情况,您可以使用 printf

printf "%s\n" "$@"

这里有一些有趣的行为:

$ set -- -n foo

然后您发现您没有看到“-n”参数,也没有看到尾随的换行符:

$ echo "$@" | od -c
0000000   f   o   o
0000003

但使用 "$*" 参数扩展确实给出了预期的结果:

$ echo "$*" | od -c
0000000   -   n       f   o   o  \n
0000007

没有阅读源代码,我怀疑当 echo 只给出一个参数时,它知道没有要解析的选项。

尽管如此,使用 printf 这样您就可以完全控制输出。