For循环不是单独循环数据

For循环不是单独循环数据

我正在尝试循环遍历我过滤的一些数据。然而它只作为一个整体循环一次。

我的示例数据:

1.1G user1
2.2G user2
3.3G user3

它在做什么:

1.1
2.2
3.3
hi

我想要它做什么:

1.1
hi
2.2
hi
3.3
hi

这是我正在使用的:

hdSize=$(du -h --max-depth=1 /home/users | awk '$1~/T|G/' | sed '$d')
gbSize=$(echo $hdSize | awk '{print $1}' | tr -d "G")

for sizeAlert in $gbSize
do
    echo $sizeAlert
    echo "hi"
done

答案1

如果您正在运行 Bash,echo $hdSize则会在空格上拆分变量,并将各个部分与空格组合起来,从而有效地将所有内容折叠到一行中。您只会从管道中获得一个字段。

相反,如果您正在运行 Zsh,或者您的IFS设置为空,则变量将不会被拆分,并且管道应该按预期工作。另一方面,在这些情况下,$gbSize也不会分割循环for,然后只运行一次。

您可以通过引用第二个管道的变量来修复 Bash 中的第一种情况,以便换行符保持不变:echo "$hdSize" | ...。但这仍然不太好。

假设您也想对目录名称执行某些操作,则需要一个循环来同时获取这两个目录名称。最简单的方法是将输出从管道传输duwhile循环 running read,该循环可以将字段从行拆分为变量:

du -BG --max-depth=1 /home/users | sed -e '$d' -e 's/G/ /' |
while read size dir; do 
    printf "directory %s is %d gigs\n" "$dir" "$size";
    if [ "$size" -gt 1024 ]; then
        printf "that's a lot.\n"
    fi
done 

du -BG无论值如何,我过去总是获取以千兆字节为单位的大小。它使比较和算术变得更容易。

答案2

通过在 $1~/G/ 之前先打印 $1 来使其工作。

hdSize=$(du -h --max-深度=1 /home/users | awk '{print $1}' | awk '$1~/T|G/' | sed '$d')

相关内容