나는 다음을 이해하기 때문에 의심이 듭니다.
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; done
in
while
while COMMANDS; do COMMANDS; done
이 명령은 read
한 줄을 읽고 이를 여러 필드로 나눕니다. 인수는 read
필드 값을 설정할 변수입니다. 따라서 첫 번째 필드와 두 번째 필드로 read in USUARIO
설정되거나 필드가 2개 이상인 경우(시나리오의 경우) 나머지 모든 필드(내부 구분 기호 포함)로 설정됩니다. 각 호출은 한 줄을 읽으며 각 루프 반복은 입력의 한 줄을 처리합니다.in
USUARIO
USUARIO
read
따라서 사용자 이름만 인쇄하려면 다음과 같이 작성해야 합니다.
while IFS=: read USUARIO rest
do
echo "$USUARIO"
done
두 번째 질문(다음에는 관련 없는 질문을 함께 묻지 마세요)의 경우 문제는 파이프라인의 각 명령이 하위 셸에서 실행되므로 그 중 하나에 설정된 변수가 파이프라인 외부에서 표시되지 않는다는 것입니다. 보다내 변수 로컬 변수가 '읽는 동안' 루프에 있지만 겉보기에 유사한 다른 루프에는 없는 이유는 무엇입니까?