Jaki byłby najlepszy sposób sprawdzenia, czy 1 $ jest liczbą całkowitą w / bin / dash?
W bashu mogłem:
[[ $1 =~ ^([0-9]+)$ ]]
Ale to nie wydaje się być zgodne z POSIX i dash tego nie obsługuje
shell
regular-expression
string
dash
Martin Vegter
źródło
źródło
foo\n123\nbar
nie jest liczbą całkowitą, ale przejdzie ten test.Niezależnie od tego
dash
,bash
,ksh
,zsh
POSIXsh
lubposh
( "a reimplementacja Bourne shell"sh
);case
konstrukt jest najbardziej powszechnie dostępne i wiarygodne:źródło
dash
? To działa dla mnie pod,bash
ale niedash
.dash
; aby przesłuchać wynik dodanyecho $?
po poleceniu case.posh
(„reimplementacja powłoki Bourne'a”) również nie ma problemu z tym rozwiązaniem.case
; jednym z powodów jest opisany przez ciebie błąd, innym jest to, że w edytorach, które mają funkcje oparte na dopasowywaniu nawiasów (vim), zapewnia ono o wiele lepsze wsparcie, i osobiście uważam, że lepiej jest je dopasować. - WRTposh
jest POSIX; cóż, cytat ze strony podręcznika, który podałem, sugeruje coś innego, ale chyba nie można polegać na tak nieformalnych stwierdzeniach. Stara skorupa Bourne'a i tak nie jest już tak znacząca teraz, gdy jesteśmy w erze POSIX.Możesz użyć
-eq
testu na łańcuchu, z samym sobą:Jeśli komunikat o błędzie stanowi problem, przekieruj wyjście błędu do
/dev/null
:źródło
" 023 "
jest to liczba. Zauważ, że działa z myślnikiem, ale nie ze wszystkimi innymi powłokami POSIX, ponieważ zachowanie nie jest określone, jeśli operandy są liczbami całkowitymi dziesiętnymi. Na przykład z ksh powiedziałoby toSHLVL
lub1+1
jest liczbą.Spróbuj użyć go jako rozszerzenia arytmetycznego i sprawdź, czy działa. W rzeczywistości musisz być nieco bardziej rygorystyczny, ponieważ rozszerzenia arytmetyczne ignorowałyby na przykład spacje początkowe i końcowe. Więc wykonaj interpretację arytmetyczną i upewnij się, że rozwinięty wynik dokładnie pasuje do oryginalnej zmiennej.
Spowodowałoby to również przyjęcie liczb ujemnych - jeśli naprawdę chcesz je wykluczyć, dodaj dodatkowe pole wyboru dla
$((${1} >= 0))
.źródło
[[
$(( ... ))
? Jeśli tak, moja odpowiedź powinna być nadal istotna, muszę tylko dodać dodatkowe cytaty.check_if_number 1.2
i funkcja zwróciła:dash: 3: arithmetic expression: expecting EOF: "1.2"
Być może z
expr
?źródło
match
nie\+
jest. Powiedziałby również, że 0 nie jest liczbą. Chceszexpr "x$1" : 'x[0-9]\{1,\}$'
W systemie POSIX możesz użyć expr :
źródło
expr
implementacje powiedzą, że 999999999999999999999 nie jest liczbą całkowitą. POSIX nie daje żadnej gwarancji, że to zadziała. W praktyce przynajmniej w systemie GNU powiedzą, że „długość” jest liczbą całkowitą.expr 9999999999999999999 + 0
daje mi status wyjścia i 3expr -12 + 0
iexpr length + 0
dać mi stan 0 wyjścia z GNU expr (+ string
siłstring
, aby być uznane jako ciąg z GNUexpr
.expr "$a" - 0
Będzie działać lepiej).-12
jest poprawną liczbą całkowitą i9999999999999999999
spowodował przepełnienie.Oto prosta funkcja stosując tę samą metodę jak Muru jest odpowiedź :
Przykład:
Wynik:
źródło