Bash - jak sprawdzić, czy argument jest nieujmeną liczbą całkowitą

0

Witam. Zacząłem uczyć się basha, stąd też postanowiłem napisać prosty program, którego elementem jest sprawdzanie, czy wprowadzone z terminala argumenty są nieujemnymi liczbami całkowitymi. W chwili obecnej ta część wygląda tak:

#!/bin/sh

if ! [ $1 =~ ^[0-9]+$ ] || ! [ $2 =~ ^[0-9]+$ ]
then
    echo "Arguments have to be non-negative integers"
    exit 2
fi

Problem polega na tym, że dla wszystkich możliwych argumentów otrzymuję komunikat z powyższego argumentu. Co powinienem poprawić, by program działał prawidłowo?

2

Naprawdę sprawdzasz czy liczba jest nieujemna regexpem? Naprawdę? :)))))

0

Po zmianach z linku @Pyxis kod wygląda tak:

if [[ ! "$1" =~ ^[0-9]+$ || ! "$2" =~ ^[0-9]+$ ]]
then
    echo "Arguments have to be non-negative integers"
    exit 2
fi

Niestety, problem wciąż występuje.

2

Sprawdziłem ten warunek i działa. Problem w tym, że użyłeś powłoki sh, a tam ci to nie zadziała. sh i bash to co innego. Linijkę

#!/bin/sh

zmień na

#!/bin/bash

Tak w ogóle to jest shebang i mówi twojej powłoce, że używamy tu nowego potoku z programem podanym w ścieżce. W takim przypadku skrypt może nie dziedziczyć zmiennych środowiskowych.

4

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.

0

Dziękuję za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1