我正在使用一个bash脚本,该脚本期望命令行参数前加一个破折号和一个文件名:
./script -abc file_name
在脚本中,我尝试使用以下命令打印出脚本的所有参数:
echo "$@"
其中显示:
-abc file_name
这是预期的。除了我自己单独使用字母“ n”时,其他所有内容都可以正常打印:
./script -n file_name
脚本中生成的echo语句仅打印出 file_name 参数,而根本不打印“ -n”参数。仅使用字母“ n”会发生此行为。当我尝试将“ -nx”或“ n”与其他任何字母一起使用时,echo语句会很好地打印出来...
为什么此echo语句本身不能与“ -n”一起使用?
答案 0 :(得分:5)
-n
或-e
是echo
命令的有效选项。
因此,它被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
,以便完全控制输出。