我正在编写一个需要两个输入文件的脚本。我写了以下代码:
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
不尝试评估其余部分)?或者我应该以不同的方式做事?
答案 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" ) ]]