읽기, IFS 및 함께 사용하는 동안 의심

읽기, IFS 및 함께 사용하는 동안 의심

나는 다음을 이해하기 때문에 의심이 듭니다.

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목록의 각 요소에 대해 일련의 명령을 실행합니다. 구문은 다음과 같습니다 . 키워드는 변수 이름을 값 목록에서 분리합니다. 다른 명령 순서가 true인 동안 일련의 명령을 실행합니다. 구문은 입니다 .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

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

관련 정보