Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.

Autor Téma: Test zdali je proměnná > 0  (Přečteno 3720 krát)

martin.nohejl

  • Člen
  • **
  • Příspěvků: 173
    • Zobrazit profil
Test zdali je proměnná > 0
« kdy: 02 Květen 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
Hlavní PC: Intel Core i5 2500 3,30GHz Sandy Bridge, MB Gigabyte H61M, DIMM DDR3 8GB 1333MHz, 1TB SATA (2 oddíly / 200GB, /home 800GB), Ubuntu 14.04CZ 32bit
Záložní PC: AMD Athlon(TM)XP 1700+, 512 MB RAM, NVIDIA GeForce4 MX 4000, disk 72GB IDE, Ubuntu 10.10CZ 32 bit

Mariocz

  • Člen
  • **
  • Příspěvků: 148
    • Zobrazit profil
Re:Test zdali je proměnná > 0
« Odpověď #1 kdy: 02 Květen 2015, 23:19:10 »
Tak od oka tomu asi nebude sedět ta desetinná čárka. Zkus tečku

Cuore

  • Závislák
  • ****
  • Příspěvků: 2534
    • Zobrazit profil
Re:Test zdali je proměnná > 0
« Odpověď #2 kdy: 03 Květen 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  ;)

martin.nohejl

  • Člen
  • **
  • Příspěvků: 173
    • Zobrazit profil
Re:Test zdali je proměnná > 0
« Odpověď #3 kdy: 03 Květen 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.
Hlavní PC: Intel Core i5 2500 3,30GHz Sandy Bridge, MB Gigabyte H61M, DIMM DDR3 8GB 1333MHz, 1TB SATA (2 oddíly / 200GB, /home 800GB), Ubuntu 14.04CZ 32bit
Záložní PC: AMD Athlon(TM)XP 1700+, 512 MB RAM, NVIDIA GeForce4 MX 4000, disk 72GB IDE, Ubuntu 10.10CZ 32 bit

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Test zdali je proměnná > 0
« Odpověď #4 kdy: 03 Květen 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.
« Poslední změna: 03 Květen 2015, 20:04:46 od GdH »

Cuore

  • Závislák
  • ****
  • Příspěvků: 2534
    • Zobrazit profil
Re:Test zdali je proměnná > 0
« Odpověď #5 kdy: 03 Květen 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í.

GdH

  • Moderátor
  • Závislák
  • ***
  • Příspěvků: 3133
    • Zobrazit profil
    • GdH-Notes
Re:Test zdali je proměnná > 0
« Odpověď #6 kdy: 03 Květen 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.
« Poslední změna: 03 Květen 2015, 20:26:10 od GdH »

martin.nohejl

  • Člen
  • **
  • Příspěvků: 173
    • Zobrazit profil
Re:Test zdali je proměnná > 0
« Odpověď #7 kdy: 04 Květen 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.
Hlavní PC: Intel Core i5 2500 3,30GHz Sandy Bridge, MB Gigabyte H61M, DIMM DDR3 8GB 1333MHz, 1TB SATA (2 oddíly / 200GB, /home 800GB), Ubuntu 14.04CZ 32bit
Záložní PC: AMD Athlon(TM)XP 1700+, 512 MB RAM, NVIDIA GeForce4 MX 4000, disk 72GB IDE, Ubuntu 10.10CZ 32 bit