Fórum Ubuntu CZ/SK

Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: martin.nohejl 02 Května 2015, 22:30:06

Název: Test zdali je proměnná > 0
Přispěvatel: martin.nohejl 02 Května 2015, 22:30:06
Zdravím,
potřeboval bych v Bashi napsat test, zdali je proměnná > 0
pokud proměnná nebude číslo a nebo pokud bude rovno nule nebo < 0, tak se vypíše "Nevyhovuje"
pokud proměnná bude číslo > 0 i desetinné, tak se vypíše "Vyhovuje"

Něco ve smyslu:
#!/bin/sh
A=37,5
if [ $A -qe 0 ]
then
echo Vyhovuje
else
echo Nevyhovuje
fi

Takto napsaný skript mi ale hlásí:
bash: [: -qe: očekáván binární operátor
Nevyhovuje
Název: Re:Test zdali je proměnná > 0
Přispěvatel: Mariocz 02 Května 2015, 23:19:10
Tak od oka tomu asi nebude sedět ta desetinná čárka. Zkus tečku
Název: Re:Test zdali je proměnná > 0
Přispěvatel: Cuore 03 Května 2015, 01:53:12
Funkce test kterou používáš neumí desetiná čísla, takže musíš na to jinak. Osobně jelikož nepotřebuješ přesnost, tak bych provedl jako první zaokrouhlení a pak můžeš použít test. Příklad zaokrouhlení čísla 12.6
Kód: [Vybrat]
echo "12.6" | awk '{printf("%d\n",$1 + 0.5)}'Dál musíš sám  ;)
Název: Re:Test zdali je proměnná > 0
Přispěvatel: martin.nohejl 03 Května 2015, 18:40:55
Tak takto mi to funguje:

#!/bin/sh
A=37,5
if [ $(echo $A | tr "," "." | awk '{printf("%d\n",$1 + 0.5)}') -gt 0 ]
then
echo Vyhovuje
else
echo Nevyhovuje
fi


nevím jestli to je ideální řešení, nebo by to šlo vymyslet lépe.
Název: Re:Test zdali je proměnná > 0
Přispěvatel: GdH 03 Května 2015, 19:01:17
Pro porovnání můžeš nejjednodušeji použít program bc (základní součást výbavy ubuntu).

Kód: [Vybrat]
echo "37.5 > 0" |bc
Výstupem je 1, pokud je podmínka splněna, jinak 0.

Jen to neřeší detekci nečíselného řetězce.
Název: Re:Test zdali je proměnná > 0
Přispěvatel: Cuore 03 Května 2015, 19:37:33
Jo o bc jsem taky uvažoval, ale zdál se mi spíš vhodnější pro matematické funkce, než porovnání.
Název: Re:Test zdali je proměnná > 0
Přispěvatel: GdH 03 Května 2015, 20:02:02
Tak ještě lepší řešení:

Kód: [Vybrat]
echo 0.3 | awk '{print (($1+0)>0)?1:0 }'
Jelikož awk při počítání převádí nečíselné řetězce na 0, stačí přičíst 0 a porovnat.

No a má to ještě jednu vlastnost - pokud ten řetězec začíná číslem, je už jedno, že třeba pokračuje abecedou, pro awk bude "37lopat" jen 37 pro aritmetický výraz. Tudíž, pokud se nepočítá s použitím menších čísel, než 1, je fuk, že to do awk pošlete s desetinnou čárkou, místo tečky, protože 37,5 si interpretuje jako 37.
Název: Re:Test zdali je proměnná > 0
Přispěvatel: martin.nohejl 04 Května 2015, 22:43:34
Tak ten bc se mi líbí, v něm mi to funguje takto:

#!/bin/sh
A=37,5
if [ $(echo "$A > 0"  | tr "," "." |bc) -eq 1 ]
then
echo Vyhovuje
else
echo Nevyhovuje
fi

Určitě tenbc použiju i jinde.