2017-06-16 132 views
0

使用-e作为命令bash文件中的标志无法识别。比方说,我们有一个名为server.sh一个bash文件,该文件只呼应了所有传递的参数:shell脚本-e命令行参数未被识别

server.sh

echo "[email protected]" 

下面是迄今为止的结果时server.sh与一个-e执行作为第一个参数:

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

任何其他参数相同,除了参数THA有效t以-e开头。谁能告诉我为什么会发生这种情况?有没有办法使-e参数在server.sh中被识别

+2

我建议看看'帮助echo'。 – Cyrus

+4

'-e'是一个回显标志,这是您应该使用printf代替的原因之一。想一些'回声'你可以做'--',但没有记录,所以不可靠。 – 123

+0

希望这会很有用,https://stackoverflow.com/questions/16483119/example-of-how-to-use-getopts-in-bash – dkb

回答

1

这里重现您的问题更简单的方法:

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

echo解析您的预期输出的选项就是为什么POSIX警告说,不要在移植的脚本命令的原因之一。

如果你想转储日志和调试参数,你可以使用bash的printf %q

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

这将难逃输出以这样的方式,你可以复制粘贴回的论点外壳以后重现它(报价变化,但参数将是相同的):

$ ./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 (!#%^)(!* 
+0

谢谢,我已经知道echo -e,我只是不认为它会被评估为-e渲染的表达式。因为参数'“$ @”'被封装在双引号内。 – ryeballar

+1

@ryeballar,一个命令(包括诸如'echo'之类的内建函数,除了'[[]]''之类的特殊语法)无法知道哪些参数被引用,哪些不是。在它被调用的时候,它所得到的只是一串C字符串;它无法分辨该阵列是如何形成的。 –

+0

@CharlesDuffy谢谢,我会记住的。 – ryeballar