在bash中比较PID

时间:2011-09-17 22:14:20

标签: bash shell unix

我正在尝试一些非常简单的事情,而且我遇到了很多麻烦。

我有一个bash脚本,我必须为类执行类似于pstree的函数。它报告了自己的pstree。输出应如下所示:

PID
|
PPID
|
.
.
.
|
1

到目前为止,这是我的代码:

ps -ef>tmp1.txt                   #save ps -ef to a file
pid=$$      
echo $pid                         #print first PID
while [ $pid != "1" ]
do
    cat tmp1.txt | while read line    #read in ps -ef file line by line
    do
        tmp=$(echo $line | cut -f2 -d' ') #return only the PID column of ps -ef
        if [$pid == $tmp]                 #compare current PID to temp PID of current line
        then
            echo "|"
            pid=$(echo $line | cut -f3 -d' ') #if they're the same we found the PPID, so save it
            echo $pid                         #and echo it
        fi
    done
done

失败的地方是比较声明:

if [$pid == $tmp]

我收到一个未找到的错误。有什么想法为什么比较不起作用?感谢您提前提供任何帮助,如果我能澄清一切,请告诉我。

4 个答案:

答案 0 :(得分:4)

单个等号用于比较字符串(if [ $pid = $tmp ])。

答案 1 :(得分:2)

我已经编辑了你的问题以缩进代码。当你缩进每个if和if语句时,它会更容易阅读。

你抱怨的是

   if [$pid == $tmp]

由于已经指出的几个原因,这是无效的。与其他编程语言不同,BASH使用单个等号,并且必须在方括号周围留一个空格。方括号是一个命令,必须是空格分隔。它是test命令的别名。这一行应如下所示:

   if [ $pid = $tmp ]

现在,=是字符串比较,如果您正在进行数字比较,则应使用-eq代替:

   if [ $pid -eq $tmp ]

而且,由于[test命令的别名,因此可以像这样编写(但很少是):

   if test $pid -eq $tmp

然而,它确实向您展示了为什么需要在方括号周围留出空间。

答案 2 :(得分:0)

您的代码效率不高。尝试使用awk,没有临时文件和嵌套循环:

ps -eo pid,ppid | awk -v START=$$ '
{ PPID[$1]=$2 } # (for each line) create PPIDs table record
END { if (PPID[START]) { # (when done) if starting pid is correct
    for(pid=START; pid!=1; pid=PPID[pid]) # print the tree
      printf "%d\n|\n", pid;
    print 1;
  }
}'

答案 3 :(得分:0)

对于那些感兴趣的人,我的最终代码如下:

echo $pid
while [ $pid != "1" ]
do
     while read line
     do
          tmp="$(echo $line | cut -f2 -d' ')"
          if [ $pid = $tmp ];
          then
               pid="$(echo $line | cut -f3 -d' ')"
          fi
     done<./tmp1.txt
     echo "|"
     echo $pid
done

感谢各位绝地大师。