【问题标题】:Bash "-n" argument not recognized by script when using "$@"使用“$@”时脚本无法识别 Bash“-n”参数
【发布时间】:2019-12-03 15:00:02
【问题描述】:

我正在使用一个 bash 脚本,该脚本需要命令行参数,前面是破折号,后面是文件名:

./script -abc file_name

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

echo "$@"

其中显示:

-abc file_name

这是预期的。除了我单独使用字母“n”时,一切都打印得很好,即:

./script -n file_name

脚本中生成的 echo 语句只打印出 file_name 参数,而不是“-n”参数。此行为仅与字母“n”本身一起发生。当我尝试“-nx”或“n”与任何其他字母时,回显语句打印得很好......

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

【问题讨论】:

  • echo -- "$@" 也会打印出--。按照 Jeb 的建议使用 printf

标签: bash echo


【解决方案1】:

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

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

printf "%s\n" "$@"

【讨论】:

  • 特别是对于echo非标准实现。 POSIX echo 不解释任何选项,但许多平台具有行为不同的“扩展”版本。这与使用printf 的修复无关(尽管不是那样,除非你想在每个参数之间换行;完全等价的更像printf '%s\n' "$*")。
【解决方案2】:

这里有一些有趣的行为:

什么时候

$ set -- -n foo

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

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

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

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

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

不过,请使用printf,这样您就可以完全控制自己的输出。

【讨论】:

    猜你喜欢
    • 2022-11-22
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 2023-03-13
    • 2015-09-10
    • 1970-01-01
    • 2016-03-04
    相关资源
    最近更新 更多