bash脚本:条件语句中的错误

时间:2015-02-02 07:12:42

标签: bash

以下脚本有什么问题?

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

2 个答案:

答案 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的论点。通常,除非您明确要进行单词拆分,否则应引用参数。我想我应该提到printfecho更强大,但echo对于固定字符串是可以的。

答案 1 :(得分:0)

你必须引用$1,因为如果它是空的而没有引用,那么它将被替换为字面上没有而不是空字符串

if [ $# -eq 0 -o "$1" = "-h" -o "$1" = "--help" ]; then
    echo $usage
    exit 0;
fi