用空格字符分割字符串(基本名称奇怪的问题)

外来蛋白

我需要从分割输出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

ps -r -e -o pcpu=,comm= |
while IFS=' ' read -r pcpu comm; do
    printf 'pcpu=%s,\tcomm=%s,\tbasename of comm=%s\n' \
        "$pcpu" "$comm" "${comm##*/}"
done

在这里,comm将保留输出中第一个空格序列之后的所有内容ps(将修剪掉第一列之前的初始空格)。

head -n 1如果您愿意,您显然可以将其作为初始管道的一部分插入

请注意,在包括在内的某些外壳程序中,bash循环在子外壳程序中运行,因此在管道完成后,在其中创建的任何变量将不可用。有两种解决方案bash

  1. lastpipe使用shopt -s lastpipe在脚本中启用shell选项
  2. 用进程替换将数据读入循环:

    while IFS=' ' read ...
       # ...
    done < <( ps ... )
    

示例运行:

$ bash script.sh
pcpu=0.0,       comm=tmux,      basename of comm=tmux
pcpu=0.0,       comm=sh,        basename of comm=sh
pcpu=0.0,       comm=sh,        basename of comm=sh
pcpu=0.0,       comm=bash,      basename of comm=bash
pcpu=0.0,       comm=bash,      basename of comm=bash
pcpu=0.0,       comm=bash,      basename of comm=bash
pcpu=0.0,       comm=ps,        basename of comm=ps
pcpu=0.0,       comm=sh,        basename of comm=sh

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章