我的脚本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
(无任何错误)
那为什么将进程更改为未运行的进程会导致语法错误,我该如何解决呢?
答案 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