Until 루프에 if 문을 넣을 수 있나요?

Until 루프에 if 문을 넣을 수 있나요?

until사용자에게 반복적으로 숫자를 묻는 루프가 포함된 스크립트를 만들어야 합니다 . - 50번이 아닌 경우 "잘못된 번호입니다. 다시 시도해 주세요."라는 메시지가 표시됩니다. - 다른 번호를 요청하세요. - 숫자가 50이면 "성공했습니다!"라는 메시지를 표시하고 중지합니다.

이것이 내가 지금까지 가지고 있는 것입니다:

    echo -n "please choose a number: "
    read number
    until [$number -eq 50];
    do
         if [$number !=50]
         then 
               echo "Wrong number; try again" 
               read wrong 
         else 
               echo -n "Please choose a number: "
               read newnum
         fi
    done 

"번호를 선택하세요" 문을 반복하는 방법을 모르겠습니다. 나는 항상 오류가 발생합니다.

      syntax error near unexpected token 'fi' 

온라인에서 찾고 있지만 UNTIL 루프의 입력 및 출력에 대한 명확한 예가 없습니다.

답변1

echo -n "please choose a number: "

read number
until [ $number -eq 50 ]
do
     # if [ $number -ne 50 ]
     # then 
           echo "Wrong number; try again" 
           read number 
     # fi
done 

echo You got it\!

첫 번째 read변수는 에서 읽혀집니다 number. 루프는 50이 될 until때까지 계속됩니다 .$number

루프 내부의 테스트는 숫자가 50(같지 않음) until인 경우에만 들어오기 때문에 불필요합니다.-ne

당신이 가진 주요 문제는 read루프 내부에서 구성 검사( ) numberuntil동일한 변수를 업데이트해야 한다는 것입니다.

if공백으로 둘러싸인 다음 단어가 명령 이름이기 때문에 공백도 중요합니다 . [$number입력했지만 "["라는 접두사가 붙은 항목을 평가합니다. 이는 기존 명령의 이름이 아닐 가능성이 높습니다. 예를 들어 첫 번째 추측이 이면 명령 42if명령을 실행하려고 시도하여 [42다음과 같은 오류가 발생합니다.[42: not found.

또한 숫자 비교는 -eq, -lt, -ge, -gt, 를 사용하여 -ge수행 됩니다 -ne.

=그리고 =!문자열의 경우.

답변2

다른 답변에는 프로그램에 대한 좀 더 일반적인 제안이 있으므로 다음과 관련된 실제 오류를 알려 드리겠습니다.if

if [$number !=50]

그것은해야한다:

if [ $number -ne 50 ]

여기서 세 가지를 바꿨어요

  • !=로 대체했습니다 -ne. 첫 번째 것은 유효하지 않습니다.
  • [와 사이에 공백을 추가했습니다 $number. (첫 번째 단계를 수정하여 이를 수행하지 않으면 어떻게 되는지 확인하십시오.)

물론 예상치 못한 동작을 하는 이상한 프로그램을 보게 되겠지만, 프로그램은 실행될 것입니다 :)

답변3

나는 이렇게 할 것이다:

#!/usr/bin/env bash

while :; do
    read -p "Please choose a number: " number
    [ "$number" -eq 50 ] 2>/dev/null
    case $? in
        0) break ;;
        1) echo "Wrong number; try again." ;;
        2) echo "Not a valid number; try again." ;;
    esac
done

echo "You got it!"

필요한 경우 while교체할 위치 until. 그런데 교수님이 그러실 것 같아요.아니요Musicstrings가 이 프로그램을 제출해 주시면 기쁘겠습니다. :)

답변4

당신의예기치 않은 태그 'fi' 근처에 구문 오류가 있습니다.then및 뒤에 CR 문자와 같은 보이지 않는 문자가 없으면 게시한 코드로 설명할 수 없습니다 else(파일이 Microsoft OS의 경우 줄 구분 기호는 LF가 아니라 CRLF입니다. 그러나 DOS 형식의 파일인 경우, doCR로 인해 또는 이후에 다른 오류 메시지가 나타날 것으로 예상 했습니다 done.

편집하다: 문제의 개정 내역을 살펴보면 다음 오류에 해당하는 것으로 보입니다.이전 버전의 스크립트.

이미 지적했듯이 명령 구문에는 따옴표가 없는 변수와 같은 많은 오류가 있지만 [루프 구문은 다음과 같다고 덧붙이고 싶습니다 until.

until
  condition-command-list
do
  action-command-list
done

condition-command-list예를 들어, 원하는 수의 명령이 될 수 있으므로 action-command-list다음을 수행할 수 있습니다.

until
  printf 'please choose a number: '
  read number || [ -n "$number" ] || exit
  [ "$number" -eq 50 ]
do
  echo >&2 'Wrong number; try again'
done

해당 || exit부분은 EOF에서 스크립트를 종료하는 것입니다(그렇지 않으면 실행 중에 스크립트의 stdout이 닫히면 영원히 반복됩니다 echo 49 | your-script).

관련 정보