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

atx*_*dba 272 bash shell

我想我不清楚如何做"和"测试.我想确保存在一个运行良好的参数,[ -e $VAR ]但结果是在空字符串上也评估为true; 这是我不想要的.

我怎么样和'他们在一起?还是有另一个一元测试来完成我想要的东西?

jay*_*ngh 517

if [ ! -z "$var" ] && [ -e "$var" ]; then
      # something ...
fi
Run Code Online (Sandbox Code Playgroud)

  • 这种解决方案甚至可以在严格遵守POSIX的shell中运行,因此也适用于`bash`; 但是,要充分利用"bashisms",请参阅@ paxdiablo的回答. (9认同)
  • 很高兴看到这个建议,而不是过时的-a。 (2认同)

pax*_*blo 67

bash联机帮助页:

[[ expression ]] - 根据条件表达式表达式的计算,返回0或1的状态.

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

expression1 && expression2-如果这两个expression1expression2是真实的.

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

if [[ -n "$var" && -e "$var" ]] ; then
    echo "'$var' is non-empty and the file exists"
fi
Run Code Online (Sandbox Code Playgroud)

但是,我不认为在这种情况下需要它,-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
Run Code Online (Sandbox Code Playgroud)

换句话说,只需使用:

if [[ -e "$var" ]] ; then
    echo "'$var' exists"
fi
Run Code Online (Sandbox Code Playgroud)


Sla*_*hin 9

if [ -n "$var" -a -e "$var" ]; then
    do something ...
fi
Run Code Online (Sandbox Code Playgroud)

 

  • 由于`POSIX`没有定义`[`的复杂测试集的行为,我们应该避免使用`-a`或`-o`和`[`.我在这里阅读[http://mywiki.wooledge.org/BashGuide/TestsAndConditionals?highlight=%28conditional%29#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29). (10认同)
  • @jaypal-singh你是对的,但是主题有'bash`标签而没有提到POSIX,所以我发布了这个版本,它在`bash`和其他一些现代shell下工作. (2认同)
  • 如果你假设使用`bash`或其他现代贝壳,甚至可以*推荐`-a`. (2认同)