Unix-IF条件问题

时间:2014-07-26 11:06:54

标签: bash unix if-statement

如果在Unix下使用条件,我遇到了问题。需要你的帮助来整理它。

if (a=1 and b is not null) or a=0 and b is null
echo "sucess"
else 
echo failure

我尝试了以下代码,但收到错误。

if [[ ${a} -eq 1 ] && [[ ! -z ${b} ]]] || [[ ${a} -eq 0 ] && [[ -z ${b} ]]]; then
    echo "sucess"
else 
    echo "Failure"
fi

有人可以建议解决方案吗?

4 个答案:

答案 0 :(得分:0)

尝试修改代码,例如[]符号之间的空格,如下所示:

if [ [ ${a} -eq 1 ] -a [ [ ! -z ${b} ] ] ] -o [ [ ${a} -eq 0 ] -a [ [ -z ${b} ] ] ]; then echo "sucess"; else echo "Failure"; fi

其中-a表示"和" -o表示"或"

有时你会使用很多[];此外,! -z可以替换为-n。它可以像这样修复:

if [ \( $a -eq 1 \) -a \( -n "$b" \) ] || [ \( $a -eq 0 \) -a \( -z "$b" \) ]; then
 echo "sucess"
else
 echo "Failure"
fi

更清楚吗?

答案 1 :(得分:0)

  

if(a = 1且b不为空)或a = 0且b为空回声"成功"其他   回声失败

if [[ $a == 1 && -n $b ]] || [[ $a == 0 && -z $b ]]; then
    echo success
else
    echo failure
fi

或者

[[ $a == 1 && -n $b ]] || [[ $a == 0 && -z $b ]] && echo success || echo failure

其他形式:

[[ ($a == 1 && -n $b) || ($a == 0 && -z $b) ]]
[[ (a -eq 1 && -n $b) || (a -eq 0 && -z $b) ]]

而这只是使用(( ))进行数值比较的情况之一是不可能的。那些宣传(( ))作为必要的操作者的人应该考虑。

答案 2 :(得分:0)

您的测试存在以下几个问题:

  1. 双括号,[[,是一个bash关键字。 Bash将解释[[作为对其内部测试命令的调用,而不是您想要的两层嵌套括号。
  2. AND(&&)和OR(||)测试在单括号内失败。
  3. 有两种方法可以修复您的测试:

    将AND和OR测试放在括号内,'()':

    if ( [ $a -eq 1 ] && [ ! -z $b ] ) || ( [ $a -eq 0 ] && [ -z $b ] ) ; then
        echo "Success"
    else
        echo "Failure"
    fi
    

    或者,使用bash扩展测试,将你的AND和OR测试放在一个双括号集' [[]]'并省略内部单支架测试:

    if [[  $a -eq 1  &&  ! -z $b   ]] || [[  $a -eq 0  &&  -z $b  ]] ; then
        echo "Success"
    else
        echo "Failure"
    fi
    

    请注意, -a -o 测试已被弃用,因此坚持使用&&和||从长远来看会更好。

答案 3 :(得分:0)

这可能更多是评论而不是答案,但请记住bash不是一般的数据处理工具。这是一些构造不能很好地从C-like转换为shell - 就像这个特定示例中的“复杂”逻辑表达式一样。为了便于理解和/或编写,您应该尝试依赖shell特定的功能。

所有这些全球性的措辞都表示,假设您的变量保持“整数”或“无”,您的测试可能只是重写为:

case "${a}:${b}" in
    0: | 1:?*)
          echo "Success"
          ;;
    *)    echo "Failure"
esac