bash条件:如何“和”expression式? (如果)

我想我不清楚如何做“和”testing。 我想确保存在一个与[ -e $VAR ]的论点,但是结果是空string也被评估为真; 我不想要。

我如何“和”他们在一起? 或者还有另一个完成我想要的testing吗?

 if [ ! -z "$var" ] && [ -e "$var" ]; then # something ... fi 

bash manpage:

[[ expression ]] – 根据条件expression式的求值返回0或1的状态。

而对于expression式,其中一个选项是:

expression1 && expression2 – 如果expression1expression2都为true,则为true。

所以你可以and他们在一起如下( -n是相反的-z所以我们可以摆脱! ):

 if [[ -n "$var" && -e "$var" ]] ; then echo "'$var' is non-empty and the file exists" fi 

但是,在这种情况下,我不认为这是需要的 – 如果xyzzy 文件存在并且可以很容易地处理空string,则-e xyzzy是真的。 如果这就是你想要的,那么你实际上并不需要-z非空检查:

 pax> VAR=xyzzy pax> if [[ -e $VAR ]] ; then echo yes ; fi pax> VAR=/tmp pax> if [[ -e $VAR ]] ; then echo yes ; fi yes 

换句话说,只要使用:

 if [[ -e "$var" ]] ; then echo "'$var' exists" fi 
 if [ -n "$var" -a -e "$var" ]; then do something ... fi 

简单地引用你的variables:

 [ -e "$VAR" ] 

如果$VAR为空,则评估为[ -e "" ]

您的版本无效,因为它评估为[ -e ] 。 现在在这种情况下,bash简单地检查单个参数( -e )是否为非空string。

从手册:

testing和[使用基于参数数量的一组规则来评估条件expression式。 …

1个参数

当且仅当参数不为null时,expression式才为真。

(另外,这个解决scheme还具有处理包含空格的文件名的额外好处)

我现在find了答案,谢谢你的build议!

 for e in ./*.cutoff.txt; do if grep -q -E 'COX1|Cu-oxidase' $e then echo xyz >$e.match.txt else echo fi if grep -q -E 'AMO' $e then echo abc >$e.match.txt else echo fi; done 

对此有何评论? grep两次似乎效率低下,但它的工作原理…