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

时间:2019-12-03 15:00:02

标签: bash echo

我正在使用一个bash脚本,该脚本期望命令行参数前加一个破折号和一个文件名:

./script -abc file_name

在脚本中,我尝试使用以下命令打印出脚本的所有参数:

echo "$@"

其中显示:

-abc file_name

这是预期的。除了我自己单独使用字母“ n”时,其他所有内容都可以正常打印:

./script -n file_name

脚本中生成的echo语句仅打印出 file_name 参数,而根本不打印“ -n”参数。仅使用字母“ n”会发生此行为。当我尝试将“ -nx”或“ n”与其他任何字母一起使用时,echo语句会很好地打印出来...

为什么此echo语句本身不能与“ -n”一起使用?

2 个答案:

答案 0 :(得分:5)

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

因此,它被echo命令占用,并且仅显示其余文本。
这是echo的已知问题,为避免这种情况,您可以使用printf

printf "%s\n" "$@"

答案 1 :(得分:0)

一些有趣的行为:

何时

$ set -- -n foo

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

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

但是使用"$*"参数扩展确实可以得到预期的结果:

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

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

不过,请使用printf,以便完全控制输出。