#!/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"를 인쇄하는 옵션을 확인하세요.