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

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

until사용자에게 반복적으로 숫자를 요청하려면 하나의 루프로 스크립트를 만들어야 합니다 . - 번호가 50번이 아닌 경우 “잘못된 번호입니다. 다시 시도하십시오." - 다른 번호를 요청하세요. - 숫자가 50이면 “You got it!”이라는 메시지를 표시합니다. 그리고 멈춰라.

지금까지 내가 가진 것은 다음과 같습니다.

    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.

루프 내부의 테스트는 불필요합니다. until숫자가 -ne50(같지 않음)일 때만 입력되기 때문입니다.

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

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!"

원하는 경우 Where 를 while로 바꿀 수 있습니다 until. 하지만 교수님이 그러실 것 같은 느낌이 들어요.~ 아니다Musicstrings가 이 프로그램을 제출했다면 기쁠 것입니다. :)

답변4

당신의예기치 않은 토큰 'fi' 근처에 구문 오류가 있습니다.thenCR 문자와 같은 보이지 않는 문자가 뒤에 오지 않으면 게시한 코드로 설명할 수 없습니다 else(파일이 줄 구분 기호가 LF가 아닌 CRLF인 Microsoft OS에서 온 경우와 같이). 하지만 DOS 형식의 파일인 경우 do및 이후의 CR로 인해 다른 오류 메시지가 나타날 것으로 예상됩니다 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).

관련 정보