$ 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