Na prośbę z komentarza Bash - jak sprawdzić, czy argument jest nieujmeną liczbą całkowitą
wklejam rozwiązanie w sh
Kopiuj
#!/bin/sh
arg1=`echo $1 | grep -P '^\\d+$'`
arg2=`echo $2 | grep -P '^\\d+$'`
if [ "$arg1" = "" -o "$arg2" = "" ]
then
echo "To nie liczby!"
exit 1;
fi;
echo 'Hello world!'
Wyjaśnienie
Najpierw wywołujemy polecenie
Kopiuj
echo $1 | grep -P '^\\d+$'
echo $1 wypisuje zmienną do polecenia grep -P '^\\d+$'. Przełącznik -P instruuje grep, że można używać wyrażeń Perla. Dlatego napisałem \d (można tu napisać \d albo \\d - przynajmniej jeden z tych wariantów powinien działać) - to samo, co [0-9], ale krócej i bardziej czytelnie.
Efekt tego polecenia zapisany jest do zmiennej arg. Polecenie grep działa w ten sposób, że wypisze to, co dopasuje. Jeśli nic nie dopasuje, nic nie wypisze. Dlatego zmienna arg1 będzie pusta, jeśli grep nic nie dopasuje.
To samo robimy dla drugiego parametru. Teraz spójrzmy na warunek
Kopiuj
if [ "$arg1" = "" -o "$arg2" = "" ]
Sprawdzamy tu czy zmienna arg1 jest pusta, używamy operatora OR (-o) i porównujemy drugą zmienną. Mówiąc krócej: obie zmienne będą puste, jeśli nie będzie w nich liczb.
Mógłbym zapisać to inaczej, ale myślę, że to wystarczy i jest w miarę czytelne. W tym przypadku grep jest poleceniem a nie elementem języka. To znaczy, że na niektórych serwerach może tego polecenia nie być albo może ono działać inaczej. To jednak rzadka sytuacja, na jakichś AIXach czy HP-UXach sprzed lat. Lepiej byłoby tu użyć basha i mieć pewność, że wszystko, co robimy, można kontrolować skryptem. Shell niby takie rzeczy umie, ale robi się je brzydko.