변수가 주어진 숫자보다 작거나 텍스트 "QUIT"와 같은 숫자인지 확인합니다.

변수가 주어진 숫자보다 작거나 텍스트 "QUIT"와 같은 숫자인지 확인합니다.

$CHOICE가 "QUIT"이 아니거나 주어진 정수(변수)보다 작은 숫자가 아닌 한 이 루프를 유지합니다.

나는 이것을 사용하고 있습니다 : (예를 들어 22를 사용)

NUMBER=22
CHOICE=99
while [ "$CHOICE" -gt "$NUMBER" ] && [ "$CHOICE" != "QUIT" ]; do
  read CHOICE < /dev/tty
done

그러나 "test"를 입력하면 첫 번째 테스트에서 정수를 예상하기 때문에 스크립트가 충돌합니다.

이 충돌을 방지하려면 어떻게 해야 합니까?

답변1

CHOICE가 "QUIT"이 아니거나 NUMBER보다 작은 정수이면 다음 코드가 반복됩니다.

NUMBER=22
while :; do
    read CHOICE
    case $CHOICE in
        QUIT) break;;
        *[!0-9]*|'') ;;
        *) test "$CHOICE" -lt "$NUMBER" && break;;
    esac
done

사용자가 ^D를 입력할 때 루프를 종료하려면 read루프 조건을 다음과 같이 설정해야 합니다 while read CHOICE; do case $CHOICE ....

답변2

조정모스비답변:

NUMBER=22
while read CHOICE ; do
  case "${CHOICE}" in
        QUIT)   break ;;
    *[!0-9]*)   ;;
          ?*)   [ "${CHOICE}" -lt $NUMBER ] && break ;;
  esac
done
  • read루프에 넣지 마십시오 .
  • 초기화가 필요하지 $CHOICE않으며
  • 대신 조건을 줄이십시오 *)-?*)모스비|''떨어질 수도 있습니다 .

답변3

알파벳 문자에 대해 추가 테스트를 수행해야 할 수도 있습니다.

while [ "$CHOICE" != "QUIT" ] && { [ "${CHOICE//[[:alpha:]]}" != "$CHOICE" ] || [ "$CHOICE" -gt 10 ]; }
  do    read CHOICE < /dev/tty
  done

관련 정보