我正在尝试循环遍历我过滤的一些数据。然而它只作为一个整体循环一次。
我的示例数据:
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" | ...
。但这仍然不太好。
假设您也想对目录名称执行某些操作,则需要一个循环来同时获取这两个目录名称。最简单的方法是将输出从管道传输du
到while
循环 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')