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変数をスペースに分割し、部分をスペースと組み合わせて、すべてを1行に効果的に折りたたみます。パイプラインは1つのフィールドのみを取得します。

代わりにZshを実行している場合、またはIFS設定が空の場合、変数は分割されず、パイプラインは期待どおりに機能するはずです。一方、このような場合、$gbSizeループは分割されず、for一度だけ実行されます。

改行文字がそのまま残るように、2番目のパイプの変数を参照してBashの最初のケースを変更できますecho "$hdSize" | ...。しかし、まだ良いではありません。

ディレクトリ名でも何かをしたいと仮定すると、両方のディレクトリ名を取得するにはループが必要です。最も簡単な方法は、フィールドを行から変数に分割できる実行ループduの出力をパイプすることです。whileread

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値に関係なく、常にサイズをギガバイト単位で取得しようとしました。比較と算術が簡単になります。

おすすめ記事