Shell脚本-e命令行参数无法识别

时间:2017-06-16 18:33:46

标签: linux bash echo command-line-arguments

在命令bash文件中使用-e作为标志是不可识别的。我们假设我们有一个名为 server.sh 的bash文件,它只回显所有传递的参数:

server.sh

echo "$@"

以下是使用-e作为第一个参数执行 server.sh 时的结果:

./server.sh -e hello ## output: hello
./server.sh -eeeee world ## output: world
./server.sh -eeeeeeeeeeeee what ## output: what

除了以-e开头的参数外,任何其他参数都是有效的。谁能告诉我为什么会这样?是否有办法在 server.sh 中识别-e参数?

1 个答案:

答案 0 :(得分:1)

以下是重现问题的简便方法:

$ echo "-e" "foo"
foo             # What happened to "-e"?

echo解析您的预期输出作为选项是POSIX在可移植脚本中警告此命令的原因之一。

如果您尝试转储参数以进行日志记录和调试,可以使用bash的printf %q

 #!/bin/bash   
 # (does not work with sh)
 printf '%q ' "$0" "$@"
 printf '\n'

这将转义输出参数,以便您可以将其复制粘贴回shell以便稍后重现(引用更改,但参数将是相同的):

$ ./myscript -e -avx --arg "my long arg" '(!#%^)(!*'
./myscript -e -avx --arg my\ long\ arg \(\!#%\^\)\(\!\*

如果你确实想要用不明确的形式写出由空格分隔的参数,你可以使用:

#!/bin/sh
# works with bash and POSIX sh
printf '%s\n' "$*"

这导致:

$ ./myscript -e -avx --arg "my long arg" '(!#%^)(!*'
-e -avx --arg my long arg (!#%^)(!*