2009-05-11 11 views
7

Napisałem skrypt basha, który pobiera liczby do obliczenia przez dane wprowadzane przez użytkownika. Mam problem, jeśli użytkownik wpisze błędnie literę lub spację, cały skrypt zawodzi, a użytkownik musi zacząć od nowa.Bash: sprawdź wprowadzone dane użytkownika

Musi być łatwy sposób sprawdzenia, czy dane wejściowe są tylko numeryczne, które będą pytać o dane wejściowe ponownie, jeśli coś innego zostanie wprowadzone przypadkowo?

Odpowiedz

17

Użyj pętli while

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

Tak, działa, dziękuję, ale ponownie używam tej samej zmiennej, więc następnym razem, gdy się pojawi, ma wartość z ostatniego wpisu żadnych pomysłów? –

+0

Nie bardzo rozumiem, co masz na myśli. do pustego łańcucha zanim wkroczymy w pętlę :) –

+1

Powyższe rozwiązanie nadal akceptuje dane wejściowe, takie jak "22aa", "aa 22" lub "a23bb" .Regexp powinien zawierać początek i d koniec ciągu: podczas gdy [[! ($ number = ~^[0-9] + $)]]; do –

8

i uniknąć ciężkiego silnika regex, użyć prostego glob:

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

Oh, fajny pomysł. ciągle zapominam o [globalnych urządzeniach. uważam, że akceptuje to "". "$ input =" "|| $ input = * [^ 0-9] *" powinno to naprawić. –

+0

To się nie powiedzie, ponieważ akceptuje puste dane wejściowe. –

4

Umożliwia przestrzeń przed i po numerze, _33 lub 33___, ale nie 3__3. i bez listów. 0 lub

- Get wejściowych od użytkownika aż Correct

# -- 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 wejście aż prawidłowe (w zasięgu)

# -- 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} 

- dostać wejście aż prawidłowe (w zasięgu) (pełny regex)

"Ponieważ wyrażenia regularne dotyczą tekstu, a nie liczb, dopasowanie liczby w danym zakresie wymaga nieco dodatkowej ostrożności. Nie można po prostu napisać [0-255 ], aby dopasować liczbę od 0 do 255. Chociaż jest to poprawne wyrażenie regularne, dopasowuje coś zupełnie innego. [0-255] to klasa znaków z trzema elementami: zakres znaków 0-2, znak 5 i znak 5 (ponownie). Ta klasa znaku dopasowuje pojedyncza cyfra 0, 1, 2 lub 5, podobnie jak [0125] „~ 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} 

. - Get wejście i sprawdzić go tylko (bez pętli 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 
Powiązane problemy