Linux 变量的IF运算
我正在bash中构建一个脚本,用于Linux(sles11sp3)。我想通过使用以下语法查找某个进程的pid来检查该进程是否存在:Linux 变量的IF运算,linux,bash,if-statement,Linux,Bash,If Statement,我正在bash中构建一个脚本,用于Linux(sles11sp3)。我想通过使用以下语法查找某个进程的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
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 )); then
do something
else
do something else
fi
问题在于,即使变量pid的值大于0,该if语句似乎总是错误的。因此,始终执行else部分,而不是正确的(如果条件为true)语句
在使用wc-l检查文件系统是否存在时,我遇到了类似的问题:
exist_tmp=$(df -x fuse.gvfs-fuse-daemon -h | grep /tmp | wc -l)
if [ ${exist_tmp} > 0 ]; then
do something
fi
即使变量的值为1(表示存在a/tmp文件系统),这也不起作用。当我将语法更改为以下内容时,它开始工作(或者至少做我希望它做的事情):
if [ ${exist_tmp} != 0 ]; then
do something
fi
在这个用例中,大于0和不等于0之间的差异让我有点摸不着头脑
有关问题如下:
非常感谢您的任何意见 对于bash,比较如下:!=用于按字典顺序比较字符串。要比较它们的整数值,请执行以下操作>:
if [ "$a" -gt "$b" ]
if [ "$a" -ne "$b" ]
还有这样的不平等:
if [ "$a" -gt "$b" ]
if [ "$a" -ne "$b" ]
有关更多详细信息或其他比较器,请参阅。ps-ef | grep-v grep | grep/sbin/syslog ng | awk'{print$2}'可以计算多行。你需要选一个。要选择第一个,请附加
头-n1
:
... | awk '{print $2}' | head -n 1
第二个示例之所以有效,是因为
wc-l
总是在一行上返回一个数字。如果要比较整数,最好使用算术If语句:
if [ ${pid} > 0 ]; then
do something
else
do something else
fi
if (( pid > 0 )); then
do something
else
do something else
fi
获取进程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
for pid in "${pids[@]}"; do
...
done
然后要比较数字,您应该使用方括号中的-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
尝试-gt而不是>前者比较整数,后者比较字符串。pgrep可以帮助您减少脚本
[
是一个命令。
是一个重定向。cmd argument>0
将cmd的输出重定向到名为0
的文件。[${exist\u tmp}>0]
因此,任何来自“wc l”的内容或者进程ID的grep应该与“-gt”和“-ne”类型的运算符进行比较?我使用的运算符用于字符串比较。这是正确的。为了澄清,所有bash值都是字符串-但是如果字符串只包含数字,并且要比较其整数值,则应该使用-gt,-ne等。我注意到一件奇怪的事情:whilepid=$(ps-ef | grep-v grep | grep/sbin/syslog ng | awk'{print$2}')
将在命令提示符下工作(如果我echo$pid
它将给我一个数字),它将在脚本中使用时返回一个空变量(当我跟踪该变量填充的部分时看到了这一点)。有什么想法吗?