【问题标题】:Bash conditionals: how to "and" expressions? (if [ ! -z $VAR && -e $VAR ])Bash 条件:如何“和”表达式? (如果 [ ! -z $VAR && -e $VAR ])
【发布时间】:2012-02-13 18:27:37
【问题描述】:

我想我不清楚如何进行“和”测试。我想确保存在一个与[ -e $VAR ] 配合良好的论点,但事实证明它在空字符串上也被评估为真;这是我不想要的。

我如何将它们“和”在一起?或者是否有另一个一元测试可以完成我想要的?

【问题讨论】:

    标签: bash shell


    【解决方案1】:
    if [ ! -z "$var" ] && [ -e "$var" ]; then
          # something ...
    fi
    

    【讨论】:

    • 这个解决方案甚至在严格符合 POSIX 的 shell 中也有效,因此也适用于 bash;但是,要充分利用“bashisms”,请参阅@paxdiablo 的回答。
    • 很高兴看到这个建议而不是过时的-a
    • 我又找到了一个优秀而详细的解释-stackoverflow.com/questions/3601515/…
    【解决方案2】:

    来自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
    

    但是,我认为在这种情况下不需要它,如果xyzzy 文件 存在并且可以很容易地处理空字符串,则-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
    

    【讨论】:

    • 我们可以用[[ -e "$var" ]] && echo "'$var' exists"缩短它
    • 是的,如果它是单行的(就像我的例子一样)。如果条件块要复杂得多,我不会这样做。
    • 如果只有一个 - 甚至可能很长 - 命令,使用这种形式是有意义的,因为它更短
    【解决方案3】:
    if [ -n "$var" -a -e "$var" ]; then
        do something ...
    fi
    

     

    【讨论】:

    • 由于POSIX 没有定义[ 的行为与复杂的测试集,我们应该避免使用-a-o[。我读了here
    • @jaypal-singh 你是对的,但是主题有bash 标签并且没有提到POSIX,所以我发布了这个在bash 和其他一些现代shell 下工作的版本。
    • 如果您假设使用bash 或其他现代shell,那么推荐-a 的理由甚至更少
    • 即使使用 bash,这些测试的行为方式也不是在所有极端情况下都得到很好的定义。考虑[ "$var1" -o "$var2" ];如果var1=(var2=),那么我们需要测试-o 是否为非空,而不是var1var2 是否为非空。这种歧义是现代(即 90 后)test 命令中 x$var 成语正确引用的唯一正当理由,而该成语需要在火灾中消亡。
    【解决方案4】:

    简单地引用你的变量:

    [ -e "$VAR" ]
    

    如果$VAR 为空,则计算结果为[ -e "" ]

    您的版本不起作用,因为它的计算结果为 [ -e ]。现在在这种情况下,bash 只检查单个参数 (-e) 是否为非空字符串。

    来自手册页:

    test 和 [ 使用一组基于参数数量的规则来评估条件表达式。 ...

    1 个参数

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

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

    【讨论】:

      【解决方案5】:

      我现在找到了答案。感谢您的建议!

      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
      

      有没有关于那个的cmets? grep 两次似乎效率低下,但确实有效...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-10
        相关资源
        最近更新 更多