我正在尝试一些非常简单的事情,而且我遇到了很多麻烦。
我有一个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]
我收到一个未找到的错误。有什么想法为什么比较不起作用?感谢您提前提供任何帮助,如果我能澄清一切,请告诉我。
答案 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
感谢各位绝地大师。