Jak v shellu otestovat, jestli je proměnná číslo

svh

Jak v shellu otestovat, jestli je proměnná číslo
« kdy: 03. 11. 2018, 07:51:44 »
Ahojte
Klasický /bin/test na to moc použitelný není když má ta proměnná několik desetinných míst, zápornou hodnotu, je prázdná nebo je to nedejbože směs náhodných znaků.
Napadlo mě ty proměnné zkusit sečíst a pokud bc vyhodí chybu tak by to znamenalo, že proměnná není číslo. Nějak takto

Kód: [Vybrat]
c=123; if ! echo "$c+$c" | bc; then echo chyba; fi
Problém je že bc mi sice chybu vyhodí

Kód: [Vybrat]
(standard_in) 1: syntax error
když mu podstrčím nečíselné hodnoty aby je sečetl, ale exit status vrátí stejně pokaždé 0 :-[. Ty čísla můžou vypadat různě. Například

Kód: [Vybrat]
2.2
-15
0
-44.094
0.13

Někdy dokonce před desetinnou tečkou chybí nula takže číslo 0.03 je .03 a podobné zvěrstva.
Další nástraha je ta když by proměnná obsahovala správně čísla ale znaky +-*/ mezi nima. třeba c=-4.2+1.3 to by byl taky pěkný chaos. Toto už vůbec netuším jak řešit.
Platná proměnná by měla obsahovat maximálně jedno kladné/záporné číslo s libobolným počtem desetinných míst. Jedná se mi o to aby se shell skript dal nějak zastavit pokud proměnná dostane nějakou nesmyslnou hodnotu která nejde spočítat. Ošetřit vstup.
« Poslední změna: 03. 11. 2018, 10:29:47 od Petr Krčmář »


reg

Re:jak v shellu otestovat jesli je proměnná číslo
« Odpověď #1 kdy: 03. 11. 2018, 08:05:34 »
regexp

Re:jak v shellu otestovat jesli je proměnná číslo
« Odpověď #2 kdy: 03. 11. 2018, 08:09:07 »
https://stackoverflow.com/questions/806906/how-do-i-test-if-a-variable-is-a-number-in-bash
Pokud neumíte anglicky, příklad je dost výmluvný. Pokud nekamarádíte s regulárními výrazy, tak máte smůlu.

svh

Re:Jak v shellu otestovat, jestli je proměnná číslo
« Odpověď #3 kdy: 03. 11. 2018, 17:14:18 »
Tak jo. Po malé úpravě toho regexu ze stackoverflow se to chová víceméně jak potřebuju.
Když proměnná $c není číslo nebo je prázdná tak to pípne.
Kód: [Vybrat]
c="" re='^[+-]?[0-9]?+([.][0-9]+)?$'; if ! [[ $c =~ $re && -n $c ]]; then beep; fiTrochu mě tam ale plete to =~. Bude fungovat jenom v shellech bash ksh a zsh a nikde jinde?

svh

Re:Jak v shellu otestovat, jestli je proměnná číslo
« Odpověď #4 kdy: 03. 11. 2018, 17:55:12 »
Ach jo mám v tom krpu! Samostatné znaky +- bez čísel tím prolezou  >:( tak jsem udělal další testovací regex a testuje to oba dva
Kód: [Vybrat]
c="-" re1='^[+-]?[0-9]?+([.][0-9]+)?$' re2='^[+-]$'; if ! [[ $c =~ $re1 && -n $c && ! $c =~ $re2 ]]; then beep; fiTakto už se to tváří neprůstřelně. Ale připadá mi to už docela překombinovaný  :-\


R2d2

Re:Jak v shellu otestovat, jestli je proměnná číslo
« Odpověď #5 kdy: 03. 11. 2018, 18:43:15 »
Tak jo. Po malé úpravě toho regexu ze stackoverflow se to chová víceméně jak potřebuju.
Když proměnná $c není číslo nebo je prázdná tak to pípne.
Kód: [Vybrat]
c="" re='^[+-]?[0-9]?+([.][0-9]+)?$'; if ! [[ $c =~ $re && -n $c ]]; then beep; fiTrochu mě tam ale plete to =~. Bude fungovat jenom v shellech bash ksh a zsh a nikde jinde?
Tenhle operátor v ksh nefunguje