나는 쉘 스크립트를 가지고 있으며 Answers.txt 파일을 통해 스크립트에 대한 답변을 제공했습니다.
echo -n "Enter your name: "; read name
echo -n "Enter your number: "; read number
echo "Your name is $name and your number is $number"
답변.txt 파일
Buvanesh
12345
나는 다음을 사용하여 이 스크립트를 실행합니다.script.sh < answers.txt
응답 파일은 동적이므로 사용자가 응답 파일에 더 많은 이름과 번호를 추가할 수 있습니다.
예를 들어
Buvanesh
12345
Kanna
45678
이 경우 스크립트를 실행하면 처음 두 개의 입력만 필요합니다. 쉘 스크립트의 모든 입력을 얻고 그에 따라 출력을 제공하고 싶습니다. 루프를 구현해야 할 것 같은데 이 경우에는 어떻게 구현해야 할지 정확히 모르겠습니다. 누구든지 도와줄 수 있나요?
답변1
while IFS= read -r name && IFS= read -r number; do
#IFS= read -r number || break
printf 'Your name is %s and your number is %d\n' "$name" "$number"
done < answers.txt
귀하의 사고 과정이 정확합니다. 조건이 AND로 연결된 명령 loop
인 루프를 도입해야 합니다 .while
read
답변2
read
더 이상 입력이 없으면 명령이 실패하므로 이를 루프 조건으로 사용할 수 있습니다.
#!/bin/sh
echo -n "Enter your name: "
while read name
do
echo -n "Enter your number: "
read number
echo "Your name is $name and your number is $number"
done
답변3
Schaller 씨의 대답은 좋습니다. 파일에서 입력을 리디렉션할 때의 단점은 이제 수동 입력도 루프의 영향을 받으므로 사용자는 루프를 종료하려면 값을 제공하는 대신 Enter 키를 눌러야 한다는 점을 알아야 합니다. 현재 논리를 사용하여 수동으로 실행하고 스크립트에 입력 파일($1)(리디렉션되지 않음)을 제공할 때 다음을 수행할 수 있습니다.
파일이 항상 "name\nnumber\n" 형식이라고 확신하는 경우 다음을 수행할 수 있습니다.
cntr=0
cat $1 | while read line
do
if [ $cntr -eq 0 ]
then
name=$line
cntr=1
elif [ $cntr -eq 1 ]
number=$line
echo "Your name is $name and your number is $number"
cntr=0
fi
done
모든 이름/번호 조합을 읽을 때까지 명세서가 인쇄됩니다.