Bash-从打印的ls中创建变量

时间:2018-11-04 17:54:47

标签: bash

我正在努力创建与ps类似的bash脚本。

我只是无法了解bash的工作原理以及如何使其工作。最糟糕的是,我什至不知道这是第一语言,而大学的压力只会使事情变得更糟。

我的计划是:

  1. 创建while循环
  2. 通过“ ls / proc”的所有内容
  3. 从找到的文件夹中创建一个变量,例如“ folder = $(awk'{print $ i}')”
  4. 从/ proc / i / status打印创建的变量和有关if的一些东西
  5. 如果某些东西不是整数,则结束while循环。

我就是不明白。当我开始学习一门新语言时,我面临着很多问题,并且像往常一样艰难地搜索它们,无助于解决任何问题。我对这项任务感到无助。我什至不知道我对这个问题的支持是否正确:(

2 个答案:

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

哪个会输出类似

enter image description here