읽기, IFS 및 while을 함께 사용하는 것에 대한 의구심

읽기, IFS 및 while을 함께 사용하는 것에 대한 의구심

다음 사항을 이해하고 있으므로 질문이 있습니다.

exec 0</etc/passwd
IFS=:
while read in USUARIO
do
    echo $USUARIO
done

출력은 모든 시스템 사용자가 포함된 목록이어야 합니다. 대신 첫 번째 행을 원할 때 x가 채워진 두 번째 행을 얻는 이유는 무엇입니까?

또한 이 스크립트에서는 숫자를 인수로 전달하고 입력한 값과 동일하고 더 많은 파일을 가진 사용자 목록을 볼 수 있습니다.

#!/bin/bash

if [[ ( $# -eq 1) && ( $1==[0-9][0-9]* )]]
then
    echo "User with $1 files or more "
    cut -d':' -f1 /etc/passwd | while IFS= read -r USUARIO
    do
        if [[ $( find / -user $USUARIO -print | wc -l ) -ge $1 ]]
        then

            echo $USUARIO
        fi
    done
exit 0
else
    printf "Error: $0 int"
    exit 1
fi

잘 작동하지만 작동하지 않는 이유는 다음과 같습니다.

#!/bin/bash

if [[ ( $# -eq 1) && ( $1==[0-9][0-9]* )]]
then
    LIST="Users with more or $1 files: "
    cut -d':' -f1 /etc/passwd | while IFS= read -r USUARIO
    do
        if [[ $( find / -user $USUARIO -print | wc -l ) -ge $1 ]]
        then

            LIST="$LIST $USUARIO"
        fi
    done
echo $LIST
exit 0
else
    printf "Error $0 int"
    exit 1
fi

출력은 사용자 이름이 추가되지 않은 원시 문자열입니다. 이유는 무엇입니까?

답변1

for및 구문을 혼동하고 있는 것 같습니다 while. for목록의 각 요소에 대해 일련의 명령을 실행합니다. 구문은 다음과 같습니다. 키워드는 값 목록에서 변수 이름을 구분합니다. 다른 명령 시퀀스가 ​​참일 때 명령 시퀀스를 실행합니다.for VARIABLE in VALUES; do COMMANDS; doneinwhilewhile COMMANDS; do COMMANDS; done

이 명령은 read한 줄을 읽고 이를 필드로 분할합니다. 매개변수 read는 필드 값을 설정할 변수입니다. 따라서 첫 번째 필드와 두 번째 필드로 read in USUARIO설정 하거나, 필드가 2개 이상인 경우(시나리오의 경우) 나머지 모든 필드(내부 구분 기호 포함)로 설정합니다. 각 호출은 하나의 행을 읽으므로 각 루프 반복은 하나의 입력 행을 처리합니다.inUSUARIOUSUARIOread

따라서 작성해야 하는 사용자 이름만 인쇄하려면

while IFS=: read USUARIO rest
do
    echo "$USUARIO"
done

두 번째 질문(그러나 다음 번에는 관련 없는 질문을 함께 묻지 마세요)과 관련하여 문제는 파이프라인의 각 명령이 하위 셸에서 실행되므로 명령 중 하나에 설정된 변수가 파이프라인 외부에 표시되지 않는다는 것입니다. 바라보다내 변수가 "읽는 동안" 루프에 로컬이고 겉보기에 유사한 다른 루프가 아닌 이유는 무엇입니까?

관련 정보