我正在尝试将“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
,ksh93
或zsh
(zsh
您可以省略set -o noglob
, 因为 zsh 只进行分割,而不是在命令替换时进行通配)。
或者,你可以这样做(特定于 bash):
readarray -t lines < <(df -k)
请注意,不能保证 的输出中每个条目只有一行df
,并且使用 shell 循环进行文本处理通常不是正确的方法。另请注意,虽然 bash 和 ksh 中的数组索引从 0 开始,但在所有其他 shell 中它们从 1 开始。