bash条件:如何“和”表达式? (如果[!-z $ VAR&& -e $ VAR])

时间:2012-01-19 02:13:08

标签: bash shell

我想我不清楚如何做“和”测试。我想确保存在一个与[ -e $VAR ]一起运行良好的论证但事实证明在空字符串上也是如此。这是我不想要的。

我如何'和'他们在一起?或者是否有其他一元测试可以实现我想要的目标?

5 个答案:

答案 0 :(得分:484)

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

答案 1 :(得分:61)

来自bash联机帮助页:

  

[[ expression ]] - 根据条件表达式表达式的评估,返回0或1的状态。

而且,对于表达式,其中一个选项是:

  

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

所以你可以and将它们放在一起如下(-n-z相反,这样我们就可以摆脱!):

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

但是,我不认为在这种情况下需要它,-e xyzzy如果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

答案 2 :(得分:8)

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

答案 3 :(得分:4)

只需引用您的变量:

[ -e "$VAR" ]

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

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

从联系手册:

  

测试和[根据参数个数使用一组规则评估条件表达式。 ...

     

1参数

     

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

(此外,此解决方案还具有使用包含空格的文件名的额外好处)

答案 4 :(得分:1)

我现在找到了答案,谢谢你的建议!

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似乎效率低下,但它有效......