Próbuję zrobić coś dość powszechnego: przeanalizować dane wejściowe użytkownika w skrypcie powłoki. Jeśli użytkownik podał prawidłową liczbę całkowitą, skrypt robi jedną rzecz, a jeśli nie jest poprawny, robi coś innego. Kłopot w tym, że nie znalazłem łatwego (i dość eleganckiego) sposobu na zrobienie tego - nie chcę, aby trzeba było go rozdzielać po znaku.
Wiem, że to musi być łatwe, ale nie wiem jak. Mógłbym to zrobić w kilkunastu językach, ale nie w BASH!
W moich badaniach znalazłem to:
I jest w tym odpowiedź, która mówi o wyrażeniu regularnym, ale o ile wiem, jest to funkcja dostępna w C (między innymi). Mimo to miał coś, co wyglądało na świetną odpowiedź, więc spróbowałem go z grep, ale grep nie wiedział, co z tym zrobić. Spróbowałem -P, co na moim pudełku oznacza traktowanie go jako wyrażenia regularnego PERL - nada. Dash E (-E) też nie działał. Ani też -F.
Żeby było jasne, próbuję czegoś takiego, szukając jakichkolwiek wyników - stamtąd zhakuję skrypt, aby wykorzystać wszystko, co otrzymam. (IOW, spodziewałem się, że niezgodne dane wejściowe nic nie zwracają, podczas gdy poprawna linia jest powtarzana.)
snafu=$(echo "$2" | grep -E "/^[-+]?(?:\.[0-9]+|(?:0|[1-9][0-9]*)(?:\.[0-9]*)?)$/")
if [ -z "$snafu" ] ;
then
echo "Not an integer - nothing back from the grep"
else
echo "Integer."
fi
Czy ktoś mógłby zilustrować, jak najłatwiej to zrobić?
Szczerze mówiąc, jest to moim zdaniem niedostatek TESTU. Powinien mieć taką flagę
if [ -I "string" ] ;
then
echo "String is a valid integer."
else
echo "String is not a valid integer."
fi
[
jest stary kompatybilnytest
;[[
to nowa rzecz Bash, z większą liczbą operacji i innymi zasadami cytowania. Jeśli już zdecydowałeś się pozostać przy Bashu, idź[[
(jest o wiele ładniejszy); jeśli potrzebujesz możliwości przenoszenia na inne muszle,[[
całkowicie unikaj .