変数が指定された数値より小さいか、テキスト「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

関連情報