他の回答には、ユーザーが希望する範囲外の数値を入力しなかったことを確認するため、多くの欠陥があります。しかし、ユーザーが数字以外の何かを入力した場合はどうなるでしょうか? 彼らの戦略は最初から破られています。
代わりに、ユーザーが必要な範囲内にある数値を入力したことが確実な場合にのみ、手放すことをお勧めします。
while :; do
read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] || continue
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) || continue
# Here I'm sure that number is a valid number in the range 0..9999
# So let's break the infinite loop!
break
done
正規表現[[ $number =~ ^[[:digit:]]+$ ]]
は、ユーザーが数字のみを入力したことを確認します。
不器用な(number=(10#$number))
部分はここにあり、ユーザーが で始まる数字を入力すると0
、bash はそれを基数で解釈しようとし8
、間違った結果 (たとえば、ユーザーがを入力010
した場合) を取得し、場合によってはエラーさえ取得します。たとえば、ユーザーが入力します09
(このガードなしで試してください)。
プロンプトを 1 回だけ表示して、ユーザーが無効な用語を入力したときに終了する場合は、次のロジックがあります。
read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] || exit 1
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) || exit 1
# Here I'm sure that number is a valid number in the range 0..9999
スクリプトが終了した理由をユーザーに説明したい場合は、die 関数を次のように使用できます。
die() {
(($#)) && printf >&2 '%s\n' "$@"
exit 1
}
read -ep 'Enter server number: ' number
[[ $number =~ ^[[:digit:]]+$ ]] ||
die '*** Error: you should have entered a number'
(( ( (number=(10#$number)) <= 9999 ) && number >= 0 )) ||
die '*** Error, number not in range 0..9999'
# Here I'm sure that number is a valid number in the range 0..9999