Bash - 在一个if语句中测试参数的存在和值

时间:2013-12-18 10:58:02

标签: bash if-statement lazy-evaluation

我正在编写一个需要两个输入文件的脚本。我写了以下代码:

if (( $# < 3 || ! ( -f $1 && -f $2 ) )); then
    echo Cannot open input files
    exit 1
fi

但如果我只提供一个输入文件,我会收到此错误:

line 4: ((: 1 < 3 || ! ( -f tests/example && -f  ) : missing `)' (error token is "tests/example && -f  ) ")

我认为OR评估不是“懒惰”,因此-f $1有效,因为它被-f tests/example取代,但-f $2会导致错误。

$# < 3声明中是否有某种方法可以“强制进行懒惰评估”(如果if不尝试评估其余部分)?或者我应该以不同的方式做事?

2 个答案:

答案 0 :(得分:3)

  

我正在编写一个需要两个输入文件的脚本。

为什么要检查参数的数量是否小于3才能退出?您需要确保不少于2个参数。使用短路进行所有检查。说:

if [[ $# < 2 || ! -f "$1" || ! -f "$2" ]]; then
    echo Cannot open input files
    exit 1
fi

实际上,即使是以下内容也足以满足您的要求:

if [[ ! -f "$1" || ! -f "$2" ]]; then
    echo Cannot open input files
    exit 1
fi

答案 1 :(得分:2)

(( ... ))用于shell中的数学运算。

重写你的if条件:

[[ $# < 3 || ! ( -f "$1" && -f "$2" ) ]]