
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
숫자가 -ne
50(같지 않음)일 때만 입력되기 때문입니다.
당신이 겪은 주요 문제는 read
루프 내부에서 구문 검사 number
와 동일한 변수( ) 를 업데이트해야 한다는 것입니다 until
.
if
공백으로 둘러싸인 단어는 명령 이름이므로 간격도 중요합니다 . [$number
입력된 모든 항목을 평가하지만 기존 명령의 이름이 아닐 가능성이 높은 '[' 접두사가 붙습니다. 예를 들어 첫 번째 추측이 이면 명령 42
은 if
명령을 실행하려고 시도하여 [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' 근처에 구문 오류가 있습니다.then
CR 문자와 같은 보이지 않는 문자가 뒤에 오지 않으면 게시한 코드로 설명할 수 없습니다 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
).