以下脚本有什么问题?
if [ $# -eq 0 -o $1 = "-h" -o $1 = "--help" ]; then ## line no: 11
echo $usage
exit 0;
fi
如果没有任何参数运行,则会出现以下错误
% ./test.sh
./test.sh: line 11: [: too many arguments
答案 0 :(得分:2)
您可以使用-o
进行短路评估,而不是使用||
,即如果条件为真,则不会对后续条件进行评估。
if [ -z "$1" ] || [ "$1" = '-h' ] || [ "$1" = '--help' ]; then
echo "$usage"
exit 0
fi
如果您只在bash中运行此脚本,则可以使用这种更紧凑的语法:
if [[ -z "$1" || "$1" = '-h' || "$1" = '--help' ]]; then
echo "$usage"
exit 0
fi
但这可能不适用于其他炮弹。
请注意,我还引用了echo
的论点。通常,除非您明确要进行单词拆分,否则应引用参数。我想我应该提到printf
比echo
更强大,但echo
对于固定字符串是可以的。
答案 1 :(得分:0)
你必须引用$1
,因为如果它是空的而没有引用,那么它将被替换为字面上没有而不是空字符串
if [ $# -eq 0 -o "$1" = "-h" -o "$1" = "--help" ]; then
echo $usage
exit 0;
fi