입력 파일에 더 많은 입력이 있는 경우 루프 쉘 스크립트

입력 파일에 더 많은 입력이 있는 경우 루프 쉘 스크립트

나는 쉘 스크립트를 가지고 있으며 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인 루프를 도입해야 합니다 .whileread

답변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

모든 이름/번호 조합을 읽을 때까지 명세서가 인쇄됩니다.

관련 정보