2009-05-11 39 views
7

ユーザー入力による計算のための番号を取るbashスクリプトを作成しました。私が持っている問題は、ユーザが誤って文字やスペースを入力した場合、スクリプト全体が失敗し、ユーザが再び起動しなければならないということです。Bash:ユーザー入力が正しいことを確認してください

他のものが誤って入力された場合、入力を再度尋ねる数値だけが入力を確認する簡単な方法でなければなりませんか?

答えて

17

簡単なグロブ使用し、whileループ

number="" 
while [[ ! $number =~ ^[0-9]+$ ]]; do 
    echo Please enter your age 
    read number 
done 
echo You are $number years old 
+0

はい、うまくいきますが、同じ変数を使用しているので、次に来るときに最後のエントリの値があります 何か考えていますか? –

+0

私はそれが何を意味するのかよく分かりません。我々はループに入る前に空の文字列に: –

+1

上記の解決策は、 '22aa'、 'aa 22'、または 'a23bb'のような入力を受け付けます。 d文字列の最後: [[! ($数=〜^ [0-9] + $)]]; do –

8

を使用し、重い正規表現エンジンを避けるために:

if [[ ! $input || $input = *[^0-9]* ]]; then 
    echo "Error: '$input' is not a number." >&2 
fi 
+0

ああ、良いアイデア。私は忘れ去っている施設については忘れています。私はそれが ""受け入れることがわかった。 "$ input =" "|| $ input = * [^ 0-9] *"はそれを修正する必要があります。 –

+0

空の入力を受け付けるという点で失敗します。 –

4

は、番号の前後にスペースをでき_33、または33___ではなくを3__3。文字はありません。 0又は

- 正しい

# -- get input until Correct 
    unset get_num 
    while [[ ! ${get_num} =~ ^[0-9]+$ ]]; do 
     echo "Please enter in a number:" 
     read get_num 
    done 
    echo This is a number : ${get_num} 

まで、ユーザからの入力を取得 -

# -- get input until Correct (within range) 
    unset get_num 
    while [[ ! ${get_num} =~ ^[0-9]+$ ]]; do 
     echo "Please enter in a number within range of (1-30):" 
     read get_num 
     ! [[ ${get_num} -ge 1 && ${get_num} -le 30 ]] && unset get_num 
    done 
    echo This is a number withn a range : ${get_num} 

(範囲内)を修正するまで入力を取得 - (範囲内)を修正するまで入力を取得(

"正規表現は数字ではなくテキストを扱うので、指定された範囲内の数字にマッチすることはちょっとした注意が必要です。[0-255 ]を0から255までの数字にマッチさせます。有効な正規表現ですが、完全に異なるものにマッチします。 [0-255]は、文字範囲0-2、文字5、文字5(再び)の3つの要素を持つ文字クラスです。この文字クラスは、ちょうど[0125]のような単一の数字0、1、2または5、一致する「〜http://www.regular-expressions.info/numericranges.html

# -- get input until Correct (within range) (another way) 
    unset get_num 
    while [[ ! ${get_num} =~ ^([1-9]|1[0-9]|2[0-9]|30)$ ]]; do 
     echo "Please enter in a number within range of (1-30):" 
     read get_num 
    done 
    echo This is a number withn a range : ${get_num} 

- 。入力を取得し、それだけをチェックし(なしwhileループ)

# -- get input, and check it only (no while loop) 
    unset get_num 
    echo "Please enter in a number:" 
    read get_num 
    if [[ ! ${get_num} =~ ^[0-9]+$ ]] ;then 
     echo "${get_num} isn't a number" 
    else 
     echo "${get_num} is a number" 
    fi 
関連する問題