我在bash中构建脚本以便在Linux上使用(SLES 11SP3)。我想通过使用以下语法查找它的pid来检查某个进程是否存在:
pid="$(ps -ef | grep -v grep | grep /sbin/syslog-ng | awk '{print $2}')"
这将使用syslog-ng进程的pid填充变量pid。然后我想在if语句中使用这个变量:
if [ ${pid} > 0 ]; then
do something
else
do something else
fi
问题是这个if语句似乎总是假的,即使变量pid的值大于0.所以,else部分总是被执行而不是正确的(如果条件为真)语句。
我有一个类似的问题,使用wc -l来检查文件系统的存在:
exist_tmp=$(df -x fuse.gvfs-fuse-daemon -h | grep /tmp | wc -l)
if [ ${exist_tmp} > 0 ]; then
do something
fi
即使变量的值为1,这也不起作用,表明存在/ tmp文件系统。当我将语法改为:
时,它开始工作(或者至少做我想做的事情)if [ ${exist_tmp} != 0 ]; then
do something
fi
在这种情况下,大于0且不等于0之间的差异使我有点不适应。
其中的问题是:
非常感谢任何输入!
答案 0 :(得分:3)
使用bash,比较像<,>,!=用于按字典顺序比较字符串。要比较它们的整数值,请执行>像这样:
if [ "$a" -gt "$b" ]
和这样的不平等:
if [ "$a" -ne "$b" ]
有关详细信息或其他比较符,请参阅this reference。
答案 1 :(得分:0)
ps -ef | grep -v grep | grep /sbin/syslog-ng | awk '{print $2}'
可以评估多行。你需要选择其中一个。要选择第一个,请附加head -n 1
:
... | awk '{print $2}' | head -n 1
第二个例子有效,因为wc -l
总是在一行上返回一个数字。
答案 2 :(得分:0)
如果要比较整数,最好使用算法if语句:
if (( pid > 0 )); then
do something
else
do something else
fi
答案 3 :(得分:0)
获取进程PID的更简单方法是使用pgrep
。
pid=$(pgrep -fo /sbin/syslog-ng) # oldest
pid=$(pgrep -fn /sbin/syslog-ng) # newest
pids=($(pgrep -f /sbin/syslog-ng)) # an array of pids
如果可能有多个进程在运行,则应使用-o
或-n
分别选择最旧或最新的进程。或者您可以更改脚本以保存并使用所有PID。
然后要比较数字,您应该使用方括号-gt
和-lt
,或切换到专为算术比较而设计的((...))
。
if ((pid > 0)) # great
if [[ $pid -gt 0 ]] # good
if [ "$pid" -gt 0 ] # meh
如果您使用数组方法,那么您将遍历所有PID。
for pid in "${pids[@]}"; do
...
done
事实上,如果您的目标只是测试流程的存在,则可以跳过获取PID并测试pgrep
的退出代码。
if pgrep -f /sbin/syslog-ng > /dev/null; then
# process exists
fi