我需要将输出从ps
分开,这是间隔分开的。
#!/bin/bash
A=$(ps -r -e -o pcpu=,comm= | head -1)
B=${A[0]}
C=${A[1]}
printf '%3s %s\n' $B $(basename $C)
输出应该是:
42 bar
相反,我得到:
usage: basename ...
为什么这不起作用,最重要的是,我如何使它起作用?
我需要将输出从ps
分开,这是间隔分开的。
#!/bin/bash
A=$(ps -r -e -o pcpu=,comm= | head -1)
B=${A[0]}
C=${A[1]}
printf '%3s %s\n' $B $(basename $C)
输出应该是:
42 bar
相反,我得到:
usage: basename ...
为什么这不起作用,最重要的是,我如何使它起作用?
要在空格字符上拆分字符串,可以使用 split+glob 运算符。这是在命令替换或参数扩展时调用的,但显然不是在存储到只能存储一个值的标量变量时。
是一个标量变量赋值。所以会将整个输出分配给
$var
,与 相同${var[0]}
。对于数组变量赋值,它是:现在,在调用它之前,像往常一样,您需要调整它:
请注意,它会拆分空格序列,并且忽略前导和尾随空格。
然后,您不想在
$B
nor的扩展上调用它$C
,$(basename...)
因此您需要引用这些:也不要忘记
--
标记选项的结束。因为您忘记了引号
$C
($C
在您的情况下为空,因为${A[1]}
从未分配过任何值),basename
所以没有传递任何参数,而不是传递了该空参数并抱怨它。其他人已经注意到您的代码中的错误是什么,并正确地建议对于您的初始占位符数据,数组将是更好的数据结构选择,以及如何确保正确拆分字符串等。
现在我们知道您正在解析的实际命令是什么,我们可以稍微更有创意地提出改进建议。
以下脚本将获取
ps
命令的每一行输出并将其读取为两个空格分隔的位。循环体以不同的方式输出读取的位:在这里,
comm
将保留输出中第一个空格序列之后的所有内容ps
(第一列之前的初始空格将被修剪掉)。如果您愿意,您显然可以将您的
head -n 1
作为初始管道的一部分插入。请注意,在某些 shell(包括
bash
)中,循环在子 shell 中运行,因此在管道完成后,在那里创建的任何变量都将不可用。对此有两种解决方案bash
:lastpipe
脚本中的 shell 选项shopt -s lastpipe
使用进程替换将数据读入循环:
示例运行:
使用 () 定义数组。如果您使用双引号,那么它将作为整个字符串。
阅读有关阵列的更多信息
使用 awk 的另一种方法: