我正在努力创建与ps类似的bash脚本。
我只是无法了解bash的工作原理以及如何使其工作。最糟糕的是,我什至不知道这是第一语言,而大学的压力只会使事情变得更糟。
我的计划是:
我就是不明白。当我开始学习一门新语言时,我面临着很多问题,并且像往常一样艰难地搜索它们,无助于解决任何问题。我对这项任务感到无助。我什至不知道我对这个问题的支持是否正确:(
答案 0 :(得分:2)
您don't need or want to parse ls
output。只需直接在通配符上循环即可。
for proc in /proc/*; do
pid=${proc#/proc/}
case $pid in *[!0-9]*) break;; esac
awk -v pid="pid" '{ printf "%i %s\n", pid, "stuff" }' $proc/status
done
您可能希望使用continue
而不是break
,但是外壳程序会在扩展通配符时按字母顺序排列命中,因此数字条目实际上会在其他条目之前分组。
parameter expansion ${variable#pattern}
产生variable
的值,并修剪掉pattern
上的任何前导匹配项。还提供${variable%suffix}
来修剪匹配模式的后缀,以及许多其他简单的字符串操作工具。
答案 1 :(得分:0)
您并不是说要从流程状态中准确提取什么,所以假设您想要它的名称和状态
借用@tripleee的答案,您可以这样做:
#!/bin/sh
for proc in /proc/*
do
pid=${proc#/proc/}
case $pid in *[!0-9]*) continue;; esac
name=$(grep "Name" $proc/status | awk '{print $2$3}')
state=$(grep "State" $proc/status | awk '{print $2 " " $3}')
echo $proc $name $state | awk '{print $1 ", whose name is " $2 " is in state " $3 " " $4}'
done
将打印以下内容:
/proc/98, whose name is kthrotld is in state I (idle)
/proc/9813, whose name is WebContent is in state S (sleeping)
/proc/99, whose name is acpi_thermal_pm is in state I (idle)
或者,如果您想花哨的话,可以打印一些颜色:
#!/bin/sh
for proc in /proc/*
do
pid=${proc#/proc/}
case $pid in *[!0-9]*) continue;; esac
name=$(grep "Name" $proc/status | awk '{print $2$3}')
state=$(grep "State" $proc/status | awk '{print $2 " " $3}')
echo $proc $name $state | awk '{print "\033[0;33m" $1 "\033[0;m, whose name is " "\033[0;32m" $2 "\033[0m is in state \033[0;34m" $3 " " $4 "\033[0m"}'
done
哪个会输出类似