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
-
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
-
Tak od oka tomu asi nebude sedět ta desetinná čárka. Zkus tečku
-
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
echo "12.6" | awk '{printf("%d\n",$1 + 0.5)}'
Dál musíš sám ;)
-
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.
-
Pro porovnání můžeš nejjednodušeji použít program bc (základní součást výbavy ubuntu).
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.
-
Jo o bc jsem taky uvažoval, ale zdál se mi spíš vhodnější pro matematické funkce, než porovnání.
-
Tak ještě lepší řešení:
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.
-
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.