bash脚本语法错误:直接在IF条件上使用PGREP时的操作数期望



我的脚本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

的结果

最新更新