在命令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
参数?
答案 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 (!#%^)(!*