嗨大家我试图在我的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语句的第三个条件
答案 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)
有几个小问题
您的第三个条件应使用反蜱(''')而非引号进行评估。 bash中的单引号表示字符串文字。因此,'expr $DOUBLE_CHECK %2' -eq "0"
总是为假
支票-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++))
答案 2 :(得分:0)
您可以将[[ .. ]]
用于字符串逻辑(其中=
和==
等效)和(( ... ))
进行数字比较,然后取消expr
:
if [[ -z "$avail" && "$WIFI_ID" = "some_str" ]] && (( DOUBLE_CHECK % 2 == 0 )); then
# your logic here
fi
请注意,$
内部带有(( ... ))
前缀的变量是可选的,而[[ ... ]]
中的引用变量是可选的,因为它不会在那里进行单词分割和循环。