首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >If语句3 conditions Bash

If语句3 conditions Bash
EN

Stack Overflow用户
提问于 2018-07-04 02:14:52
回答 2查看 4.2K关注 0票数 0

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

代码语言:javascript
运行
复制
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 `('

如果我只提出一个条件:

代码语言:javascript
运行
复制
if (( $(echo "$c1 < 0" | bc -l) )); 

它可以工作,但当我将这三个参数添加为和(&&)时,我得到了错误。有谁可以帮我?

EN

回答 2

Stack Overflow用户

发布于 2018-07-04 02:43:08

更有效的方法(假设您知道您的值是数字,并且只需要检查它们是否都是负数)将是:

代码语言:javascript
运行
复制
if [[ $c1 = -* ]] && [[ $c2 = -* ]] && [[ $c3 = -* ]]; then
      >&2 echo "   ++ Constraints OK"
else
      >&2 echo "   ++ Constraints WRONG"
fi

如果您想更具体地了解允许的格式(f/e,允许前导空格),则正则表达式是另一种选择,它的实现效率同样比生成一系列调用bc的子subshells更有效

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-07-04 03:43:50

首先,将关系运算符和运算符传递给bc以消除一些标点符号(也只调用bc一次):

代码语言:javascript
运行
复制
if (( $(echo "$c1 < 0 && $c2 < 0 && $c3 < 0" | bc -l) == 1 ))
then
    >&2 echo -e "   ++ Constraints OK"
else
    >&2 echo -e "   ++ Constraints WRONG"
fi

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

代码语言:javascript
运行
复制
function bc_true() {
    (( $(echo "$@" | bc -l) != 0 ))
}

并编写一个(IMO)更干净的shell表达式:

代码语言:javascript
运行
复制
if bc_true "$c1 < 0 && $c2 < 0 && $c3 < 0"
then
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51160734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档