Na prośbę z komentarza Bash - jak sprawdzić, czy argument jest nieujmeną liczbą całkowitą
wklejam rozwiązanie w sh
#!/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
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
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.