根据另一个命令的输出运行命令

根据另一个命令的输出运行命令

操作系统:AIX 7100-04-1216

所以基本上我试图编写一个 for 循环来查看我的系统上有哪些卷组、哪些文件系统驻留在这些卷组中以及每个文件系统的大小是多少。

我有以下代码:

for LINE in `lsvg` ; do
    echo "Volume Group: "${LINE}
    for LINE2 in `lsvgfs ${LINE}` ; do
        echo "`lsvgfs ${LINE}` \n"
        df -g ${LINE2}
    done
done

lsvg 的输出

rootvg
nimvg

lsvgfs 的输出(对于 rootvg)

/
/usr

lsvgfs 的输出(对于 nimvg)

/export/nim/lpp_source
/export/nim/spot 

df -g 的输出(对于卷组 rootvg 中的 /)

Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4           5.25      2.86   46%     9957     2% /

df -g 的输出(对于卷组 rootvg 中的 /usr)

Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd2           2.00      0.17   92%    43194    50% /usr

df -g 的输出(对于卷组 nimvg 中的 /export/nim/lpp_source)

Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/fslv02       10.00      8.24   18%      597     1% /export/nim/lpp_source

df -g 的输出(对于卷组 nimvg 中的 /export/nim/spot)

Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4           5.25      2.86   46%     9957     2% /

它应该做什么:

Volume Group: rootvg
File System: /
/dev/hd4           5.25      2.86   46%     9957     2% /
File System: /usr
/dev/hd2           2.00      0.17   92%    43194    50% /usr
File System: /var

Volume Group: nimvg
File system: /export/nim/lpp_source
/dev/fslv02       10.00      8.24   18%      597     1% /export/nim/lpp_source
File system: /export/nim/spot 
/dev/hd4           5.25      2.86   46%     9957     2% /

我得到什么:

Volume Group: rootvg
/
/usr
Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4           5.25      2.86   46%     9957     2% /
/
/usr
Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd2           2.00      0.17   92%    43194    50% /usr


Volume Group: nimvg
/export/nim/lpp_source
/export/nim/spot 
Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/fslv02       10.00      8.24   18%      597     1% /export/nim/lpp_source
/export/nim/lpp_source
/export/nim/spot 

Filesystem    GB blocks      Free %Used    Iused %Iused Mounted on
/dev/hd4           5.25      2.86   46%     9957     2% /

答案1

首先是关于风格的注释。使用for循环来迭代输出行很少是一个好主意。循环for将在空格上分割其输入,因此如果每行有多个单词,它会将每个单词分解为不同的变量。您应该使用while它,因为这样可以更优雅地处理空格。此外,通常首选使用 来$(command)代替`command`.

但这可能不是你的问题。主要问题是您正在回显lsvgfs ${LINE}每行结果的结果lsvgfs ${LINE}

for LINE2 in `lsvgfs ${LINE}` ; do
        echo "`lsvgfs ${LINE}` \n"
done

所以,当然,你会得到这些行两次:

/
/usr

试试这个:

lsvg | while read LINE; do
    echo "Volume Group: ${LINE}"
    lsvgfs "${LINE}" | while read LINE2; do
        echo "File System: ${LINE2}"
        df -g ${LINE2}
    done
echo ""
done

相关内容