2017-04-16 59 views
0

嗨,伙计们我试图在我的bash脚本中执行一项检查,它需要满足三个条件,我能够在if语句中使前两个条件工作,因为我想,但是当我想用运算符实现一些算术运算的第三次检查时,脚本甚至不会启动。如何在Bash的if语句中使用算术

DOUBLE_CHECK=0 

if [[ -z "$avail" && "$WIFI_ID" == "some_str" && 'expr $DOUBLE_CHECK % 2' -eq "0"]]; then 
     sudo caffeinate xterm -geometry 70x20+0+0 -fa monospace -fs 8 -e './script1.sh' & disown 

fi 
(($DOUBLE_CHECK++)) 

的想法是我想要的第三次检查,有一个数字,增量随着时间的推移我while循环内,然后检查,当它被2整除它传递的if语句

回答

1

作为一个单独的应答指出,可以使用反引号或优选$()扩大表达到内命令的输出,这样的:

if [[ -z "$avail" && $WIFI_ID == "some_str" && $(expr $DOUBLE_CHECK % 2) -eq "0" ]] 

请注意我已经加入一个(必需)空间在最后的]]之前。

另一种可能性是使用算术表达式:

if [[ -z $avail && $WIFI_ID == "some_str" ]] && ((DOUBLE_CHECK % 2 == 0)) 

请注意我已删除无害的,但不必要的行情:双括号内的条件表达式是不是一个正常的命令,这是特殊的shell语法,它不执行分词。我留下了some_str左右的引号,因为如果不引用引号,则等式/不等式比较将在右侧表达式上执行模式匹配。算术表达式中的变量名之前也没有$:它可以工作,但在(())$(())内部不需要。

表达也可以被表示为:

if [[ -z $avail && $WIFI_ID == "some_str" ]] && ! ((DOUBLE_CHECK % 2)) 

这样做的原因是,(())具有0返回代码,如果它的数值结果为非零,否则非零返回代码。

0

第3条件有几个小问题

  1. 您的第三个条件应该使用back-ticks('`')而不是引号进行评估。 bash中的单引号表示字符串文字。所以,'expr $DOUBLE_CHECK %2' -eq "0"总是是假的

  2. 检查-eq是用来比较数字。你的语句使用字符串(比较字符串,使用正常==语法)

请尝试,

DOUBLE_CHECK=0 

if [[ -z "$avail" ]] && [[ "$WIFI_ID" == "some_str" ]] && [[ `expr $DOUBLE_CHECK % 2` -eq 0 ]]; then 
     sudo caffeinate xterm -geometry 70x20+0+0 -fa monospace -fs 8 -e './script1.sh' & disown 

fi 
(($DOUBLE_CHECK++)) 
+1

我不认为你的#3建议是有效的。 Bash条件支持逻辑运算符,我不知道有什么理由避免它们(与标准'''测试中的'-a'和'-o'相反]。 – Fred

+0

'[[“A”==“A”]] && [[“B”==“B”]] && echo'foo''适合我 –

+0

是的,它的工作原理。我并不是说你提出的替代语法是错误的,我的观点是,我不认为推荐将逻辑运算符置于条件之外是个好建议。如果是(可能),这对我来说是新鲜事物。 – Fred

0

可以使用[[ .. ]]字符串逻辑(其中===是等同的)和((...))用于数字比较,并废除expr

if [[ -z "$avail" && "$WIFI_ID" = "some_str" ]] && ((DOUBLE_CHECK % 2 == 0)); then 
    # your logic here 
fi 

请注意,pr使用$的固定变量在((...))内部是可选的,并且在[[ ... ]]内引用变量是可选的,因为不会在那里进行分词和匹配。