在 bash 中将“df -h”输出读取为行数组

在 bash 中将“df -h”输出读取为行数组

我正在尝试将“df -h”输出读取为 shell 脚本中的行数组。

我尝试了下面的代码,但它的 var[0] 给了我第一行的第一列而不是整个第一行。我的期望是在一次迭代中获得完整的生产线。

var=($(df -k))
echo " echo ${var[0]}

不使用 awk 如何实现这一点?

答案1

$(cmd)(命令替换)在列表上下文中不加引号会调用 POSIX shell 中的 split+glob 运算符,例如bash.在这里,您不需要 glob 部分。分割部分根据在$IFS(默认情况下为空格、制表符和换行符)中找到的字符进行分割。

所以在这里,你想要:

IFS='
' # split on newline only. Also IFS=$'\n' in bash/ksh93/zsh/mksh
set -o noglob  # disable globbing
lines=($(df -k)) # use the split+glob operator

(请注意,它会删除空行)。

这也适用于mksh, yash,ksh93zshzsh您可以省略set -o noglob, 因为 zsh 只进行分割,而不是在命令替换时进行通配)。

或者,你可以这样做(特定于 bash):

readarray -t lines < <(df -k)

请注意,不能保证 的输出中每个条目只有一行df,并且使用 shell 循环进行文本处理通常不是正确的方法。另请注意,虽然 bash 和 ksh 中的数组索引从 0 开始,但在所有其他 shell 中它们从 1 开始。

相关内容