IF对变量的操作

时间:2015-05-30 09:08:19

标签: linux bash if-statement

我在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之间的差异使我有点不适应。

其中的问题是:

  1. 有没有人知道为什么pid查询和if语句不能做我想做的事情?
  2. 有没有人知道>的问题是什么? 0和!= 0可能是?
  3. 非常感谢任何输入!

4 个答案:

答案 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