"for .. in" 루프를 사용하는 방법

"for .. in" 루프를 사용하는 방법
#!/bin/bash

if [ ! $# -eq 2 ];
then echo "You have not inputted the correct amound of arguments.
usage: $0 file user
Where file is the file to search
and user is the user to find" 
fi

if [ ! -e $1 ];
then echo "You have inputted an invalid filename.
usage: $  file user
Where file is the file to search
and user is the user to find"
fi

let count=0

for line in `cat $1`; do
count=`expr $count + 1`
if [ "$line" == "$2" ]; then
        echo "$2 found on line: $count"
        exit 0
else
        echo "Would you like to insert this username? y/n"
        read answer
        answer=`echo $answer | tr [a-z] [A-Z]`

    if [ "$answer" != "y" ]; then
            cat "$answer" >> "/classlist.txt"
    else
            echo "That's fine. Program ending ..."
    exit 0
    fi
fi
done

내 "for in" 루프가 예상된 작업을 수행하지 않습니다. 루프는 텍스트 파일에서 데이터를 가져와서(그런데 텍스트 파일은 줄 바꿈으로 구분된 이름 목록일 뿐입니다) 변수 "line"에 할당합니다. "for in" 루프가 끝나면 텍스트 파일의 다음 줄에 "line" 변수를 다시 할당해야 합니다. 그러나 이는 사실이 아니다. 스크립트는 텍스트 파일의 첫 번째 데이터 항목만 읽습니다. 루프를 잘못 사용하고 있습니까?

답변1

짧은 대답: 다음 exit 0으로 변경하세요.continue

for 루프가 제대로 작동하는지 확인하려면 간단한 테스트를 수행해 보세요.
count=0 for line in cat $1 do count=expr $count + 1 echo $line done echo "Counted $count lines"

이것이 파일의 모든 행에 정확한 개수를 제공한다면 for 루프가 제대로 작동하는 것입니다. (정확한 것 같습니다. 허용되는 표준은 아니지만 나 자신은 이 형식을 선호합니다)

첫 번째 질문은 다음과 같습니다. 스크립트를 종료한다는
if [ "$line" == "$2" ]; then echo "$2 found on line: $count" exit 0 의미입니다 exit 0(즉, 더 이상 아무 작업도 하지 않음). 이 줄은 종료되므로 if클릭하면 done다음 줄의 내용을 읽을 수 있으므로 완전히 제거할 수 있습니다. 또는 continue루프의 맨 위로 돌아가서 다음 줄을 읽도록 변경할 수도 있습니다 .

두 번째 질문은:
if [ "$answer" != "y" ]; then cat "$answer" >> "/classlist.txt" else echo "That's fine. Program ending ..." exit 0 fi 정말로 스크립트를 종료하고 싶다면 exit 0문제가 되지 않는다는 것입니다. 루프에서 벗어나려면 이것이 여야 합니다 break. 루프의 맨 위로 이동하여 다음 줄을 읽으려면 이것이 이어야 합니다 continue.

루프를 종료하는 다양한 방법이 코드에 어떤 영향을 미치는지 확인하려면 echo "Finished loop"스크립트 끝에 이 줄을 추가하세요. break, continue및 옵션을 실험하여 exit 0"Finished Loop"를 인쇄하는 옵션을 확인하세요.

관련 정보