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" | .... 하지만 아직 좋지는 않습니다.

디렉토리 이름으로도 뭔가를 하고 싶다고 가정하면 두 디렉토리 이름을 모두 가져오려면 루프가 필요합니다. 가장 간단한 방법은 필드를 행에서 변수로 분할할 수 있는 실행 루프 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값에 관계없이 항상 크기를 기가바이트 단위로 가져오곤 했습니다. 비교와 산술이 더 쉬워집니다.

답변2

$1~/G/ 앞에 $1을 인쇄하여 작동하도록 했습니다.

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

관련 정보