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
或 -e
是 echo
命令的有效选项。
因此它被 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
这样您就可以完全控制输出。
我正在使用 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
或 -e
是 echo
命令的有效选项。
因此它被 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
这样您就可以完全控制输出。