Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: svh 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
c=123; if ! echo "$c+$c" | bc; then echo chyba; fi
Problém je že bc mi sice chybu vyhodí
(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
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.
-
regexp
-
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.
-
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.
c="" re='^[+-]?[0-9]?+([.][0-9]+)?$'; if ! [[ $c =~ $re && -n $c ]]; then beep; fi
Trochu mě tam ale plete to =~. Bude fungovat jenom v shellech bash ksh a zsh a nikde jinde?
-
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
c="-" re1='^[+-]?[0-9]?+([.][0-9]+)?$' re2='^[+-]$'; if ! [[ $c =~ $re1 && -n $c && ! $c =~ $re2 ]]; then beep; fi
Takto už se to tváří neprůstřelně. Ale připadá mi to už docela překombinovaný :-\
-
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.
c="" re='^[+-]?[0-9]?+([.][0-9]+)?$'; if ! [[ $c =~ $re && -n $c ]]; then beep; fi
Trochu mě tam ale plete to =~. Bude fungovat jenom v shellech bash ksh a zsh a nikde jinde?
Tenhle operátor v ksh nefunguje