Bash脚本语法错误:直接在if条件下使用pgrep时,预期操作数

时间:2019-02-18 10:57:32

标签: bash shell sh

我的脚本myscript.sh检查mysqld是否正在运行:

mypid=`pgrep mysqld`

if ! (( $mypid > 0 )); then
  echo "no"
else
  echo "yes"
fi

输出(以root身份运行./myscript.sh):

  

现在,如果我将第一行更改为未运行的进程,例如mysqld123

mypid=`pgrep mysqld123`

if ! (( $mypid > 0 )); then
  echo "no"
else
  echo "yes"
fi

输出:

  

./ myscript.sh:第3行:((:> 0:语法错误:预期操作数(错误令牌为“> 0”)

     

预期输出:no(无任何错误)

那为什么将进程更改为未运行的进程会导致语法错误,我该如何解决呢?

1 个答案:

答案 0 :(得分:2)

这种比较的逻辑是完全错误的。您期望如果pid不可用,则运算符((..))将失败,并且取反逻辑会使您的结果成为布尔True。发生这种情况不是

pgrep与给定名称的过程不匹配时,它返回一个空结果,因此,您的比较实际上是在扩展pgrep mysqld123之后变为

! ((   > 0  ))

>的LHS为空,这是((..))的语法错误,因为它需要两个操作数来执行算术。理想的逻辑是在找到匹配项或找不到匹配项时使用pgrep命令的返回代码给外壳程序

if ! pgrep mysqld 2>&1 > /dev/null; then
    printf '%s\n' 'msqld not running'
fi

有关此主题的更多相关详细信息,请参见bash中的Arithmetic Expansion。要回答OP的问题,为什么在((..))中引用一个变量不起作用? -((..))语法是一种算术运算符,与[[[不同,如果正确引用,则可以处理空字符串。在算术上下文中,空值没有意义,就像询问"" + 0

的结果一样