我的脚本myscript.sh
检查MySQLD是否正在运行:
mypid=`pgrep mysqld`
if ! (( $mypid > 0 )); then
echo "no"
else
echo "yes"
fi
输出(runn./myscript.sh作为根):
是
现在,如果我将第一行更改为未运行的过程,例如mysqld123
:
mypid=`pgrep mysqld123`
if ! (( $mypid > 0 )); then
echo "no"
else
echo "yes"
fi
输出:
./myscript.sh:第3行:(((> 0:语法错误
否
预期输出:no
(没有任何错误)
那么,为什么将过程更改为未运行的事物会导致语法错误,我该如何解决?
此比较的逻辑是完全错误的。您期望如果不可用PID,操作员((..))
将失败,而否定逻辑将使您的结果成为现实。那是不是发生的情况。
当pgrep
无法匹配给定名称的过程时,它会返回一个空的结果,因此您的比较在扩展pgrep mysqld123
! (( > 0 ))
>
的LHS为空,这是((..))
的语法错误,因为它需要两个操作数来执行算术。理想的逻辑是在找到匹配项时使用pgrep
命令的返回代码或无法找到匹配项为
if ! pgrep mysqld 2>&1 > /dev/null; then
printf '%sn' 'msqld not running'
fi
有关该主题的更多相关细节,请参见bash
中的算术扩展。要回答OP的问题,为什么引用((..))
中的变量不起作用? - 与[
或[[
不同,((..))
语法是算术运算符,如果正确引用,可以处理空字符串。在算术上下文中,一个空值是没有意义的,好像在问"" + 0