如何在Bash的if语句中使用算术

时间:2017-04-16 23:13:30

标签: bash

嗨大家我试图在我的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语句的第三个条件

3 个答案:

答案 0 :(得分: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的返回码为public function loginSubmit() { $email = request('email'); $password = request('password'); if (Auth::attempt(['email' => $email, 'password' => $password])) { return 'logged in'; } else { return 'not logged in'; } ,否则返回非零的返回码。

答案 1 :(得分:0)

有几个小问题

  1. 您的第三个条件应使用反蜱(''')而非引号进行评估。 bash中的单引号表示字符串文字。因此,'expr $DOUBLE_CHECK %2' -eq "0" 总是为假

  2. 支票-eq用于比较数字。您的语句使用字符串(比较字符串,使用正常的==语法)

  3. 请尝试,

    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++))
    

答案 2 :(得分:0)

您可以将[[ .. ]]用于字符串逻辑(其中===等效)和(( ... ))进行数字比较,然后取消expr

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

请注意,$内部带有(( ... ))前缀的变量是可选的,而[[ ... ]]中的引用变量是可选的,因为它不会在那里进行单词分割和循环。