如果陈述3条件Bash

时间:2018-07-03 18:14:52

标签: linux bash if-statement

我想用三个必须同时满足的条件来做一个if语句。我在Windows下使用Ubuntu Bash,$ c1,$ c2和$ c3的值不是整数(十进制负数)。

if [ (( $(echo "$c1 < 0" | bc -l) )) ]  && [ (( $(echo "$c2 < 0" | bc -l) )) ] && [ (( $(echo "$c3 < 0" | bc -l) )) ];
    then
      >&2 echo -e "   ++ Constraints OK"

else
      >&2 echo -e "   ++ Constraints WRONG"

fi

但是,我在if行中收到以下语法错误:syntax error near unexpected token `('

如果我只提出一个条件:

if (( $(echo "$c1 < 0" | bc -l) )); 

它可以工作,但是当我将它们三个添加为AND(&&)时,出现了错误。谁能帮我吗?

2 个答案:

答案 0 :(得分:1)

效率要高得多(假设您知道您的值是数字,并且只需要检查它们是否均为负数),就可以做到:

if [[ $c1 = -* ]] && [[ $c2 = -* ]] && [[ $c3 = -* ]]; then
      >&2 echo "   ++ Constraints OK"
else
      >&2 echo "   ++ Constraints WRONG"
fi

如果您想更详细地说明允许的格式(f / e,允许前导空格),则正则表达式是另一种选择,与产生一系列调用bc的子shell相比,可以更有效地实现它:

nnum_re='^[[:space:]]*-([[:digit:]]*[.][[:digit:]]+|[[:digit:]]+)$'
if [[ $c1 =~ $nnum_re ]] && [[ $c2 =~ $nnum_re ]] && [[ $c3 =~ $nnum_re ]]; then
      >&2 echo "   ++ Constraints OK"
else
      >&2 echo "   ++ Constraints WRONG"
fi

答案 1 :(得分:0)

首先,将关系AND运算符传递到bc中以消除一些标点符号(也仅调用bc一次):

if (( $(echo "$c1 < 0 && $c2 < 0 && $c3 < 0" | bc -l) == 1 ))
then
    >&2 echo -e "   ++ Constraints OK"
else
    >&2 echo -e "   ++ Constraints WRONG"
fi

尽管是我,但如果bc将表达式的结果计算为非零,我将创建一个返回“ true”退出状态的shell函数。然后,您可以将大多数丑陋的标点符号隐藏在与主要逻辑分开的一个地方:

function bc_true() {
    (( $(echo "$@" | bc -l) != 0 ))
}

并编写一个(IMO)清洁程序外壳表达式:

if bc_true "$c1 < 0 && $c2 < 0 && $c3 < 0"
then
    ...