====Feltételes utasítások====
Az előző fejezetben tárgyalt ''szamol.sc'' szkriptben oldjuk meg, hogy a második paraméter nulla értéke esetén ne történjen osztás művelet. Ehhez meg kell vizsgálni a második paramétert és ha az értéke egyenlő nullával, akkor a program figyelmeztessen szöveg kiírásával, ellenkező esetben pedig végezze el az osztást és a maradék számítását. Módosítsuk a szkriptet a következőre:
#!/bin/bash
echo "$1 + $2 = `expr $1 + $2`"
echo "$1 - $2 = `expr $1 - $2`"
echo "$1 * $2 = `expr $1 '*' $2`"
if test $2 -eq 0
then
echo "A nullával való osztás értelmetlen"
else
echo "$1 / $2 = `expr $1 '/' $2`"
echo "maradék `expr $1 '%' $2`"
fi
Figyeljük meg a szkriptben az idézőjeleket, és azt, hogy itt már nem alkalmazunk változót az értékek kiszámításához, azok az ''echo'' parancs argumentumába vannak ágyazva parancs behelyettesítéssel. A szorzás sorában mindhárom típusú idézőjelet megtaláljuk.\\
Az ezután következik a feltételes utasítások gyakori formája: **if** kifejezés **then** utasítás1 **else** utasítás2. Ebben az //utasítás1// akkor kerül végrehajtásra, ha a kifejezés igaz. Hamis esetén az //utasítás2// kerül végrehajtásra. Az **if** szerkezet végét a **fi** jelöli.\\
A kifejezések kiértékelésére a **test** parancsot alkalmazhatjuk.
====A test parancs====
A **test** paranccsal ellenőrizhetjük fájlok tulajdonságait, karakterláncokat és számszerű adatokat.\\
A parancs szintaxisa a következő: ''test kifejezés'' vagy ''[ kifejezés ]''\\
A zárójelek mindkét oldalán egy elválasztó szóközt kell hagyni.\\
Az alábbi, ''nulle.sc'' nevű program nulla szöveget ír ki, ha az első paramétere 0:
#!/bin/bash
if test $1 -eq 0
then
echo Nulla
fi
Tehát ebben az esetben a ''test $1 -eq 0'' kifejezés értéke igaz, ha a paraméter nulla:
palferi@lizi:~/proba$ ./nulle.sc 5
palferi@lizi:~/proba$ ./nulle.sc 0
Nulla
Láthatjuk, hogy más számot megadva paraméterként a program semmit sem ír ki.\\
A szkripben az alábbi szintaxist is használhatjuk:
#!/bin/bash
if [ $1 -eq 0 ]
then
echo Nulla
fi
====Fájlok tesztelése a test paranccsal ====
Az alábbi táblázat a **teszt** parancs fontosabb argumentumait mutatja, amelyekkel fájlok tulajdonságait ellenőrizhetjük:
^ Argumentum ^ Jelentés | ^ Argumentum ^ Jelentés ^
| -d file | Igaz ha a file létezik és könyvtár | | -w file | Igaz ha a file létezik és írható |
| -e file | Igaz ha a file létezik | | -x file | Igaz ha a file létezik és végrehajtható |
| -f file | Igaz ha a file létezik és szabályos fájl | | -O file | Igaz ha a file létezik és az aktuális felhasználó tulajdonában van |
| -h file | Igaz ha a file létezik és szimbolikus link | | -G file | Igaz ha a file létezik és az aktuális csoport tulajdonában van |
| -r file | Igaz ha a file létezik és olvasható | | file1 -nt file2 | Igaz ha file1 újabb (a módosítási időt tekintve), mint file2 |
| -s file | Igaz ha a file létezik és 0-nál nagyobb méretű | | file1 -ot file2 | Igaz ha file1 régebbi, mint file2 |
====Numerikus értékek tesztelése a test paranccsal ====
^ Argumentum ^ Jelentés ^
| A -eq B | A és B értéke egyenlő |
| A -ne B | A és B értéke nem egyenlő |
| A -gt B | A nagyobb mint B |
| A -ge B | A nagyobb vagy egyenlő mint B |
| A -lt B | A kisebb mint B |
| A -le B | A kisebb vagy egyenlő mint B |
====Karakterláncok tesztelése a test paranccsal ====
^ Argumentum ^ Jelentés ^
| string1 = string2 |Igaz ha a sztringek megegyeznek |
| string1 != string2 |Igaz ha a sztringek nem egyeznek meg |
| -z string |Igaz, ha a karakterlánc hossza nulla |
| -n string |Igaz, ha a karakterlánc hossza nem nulla |
====Logikai tesztek a test paranccsal ====
A test utasítás által támogatott logikai műveletek a következőek:
^ Argumentum ^ Jelentés ^
| expr1 -a expr2 | Igaz ha expr1 és expr2 is igaz |
| expr1 -o expr2 | Igaz ha expr1 vagy expr2 igaz |
| ! expr | Igaz ha expr hamis |
==== Gyakorló feladatok feltételes utasításokra ====
**1.** Írjon szkriptet ''gyak1.sc'' néven, ami összeszorozza két paraméterét, de ha csak egy paramétert adunk meg akkor négyzetre emeli!
#!/bin/bash
if [ $# -eq 1 ]
then
echo "$1 a négyzeten `expr $1 '*' $1`"
else
echo "$1 * $2 = `expr $1 '*' $2`"
fi
**2.** Írjon szkriptet ''gyak2.sc'' néven, ami a paraméterében megadott egész számról eldönti, hogy páros vagy páratlan, és az ennek megfelelő üzenettel tér vissza!
#!/bin/bash
P=`expr $1 '%' 2`
if [ $P -eq 0 ]
then
echo "A $1 szám páros"
else
echo "A $1 szám páratlan"
fi
**3.** Írjon szkriptet ''gyak3.sc'' néven, ami a két paramétere közül a nagyobbat vonja ki a kisebből. Ha két paraméter egyenlő, az ''Egyenlők'' szöveg jelenjen meg. A script mind a ''./gyak3.sc 9 6'', mind a ''./gyak3.scp 6 9'' -re ezt írja ki: ''9 - 6 = 3''
#!/bin/bash
if [ $1 -eq $2 ]
then
echo Egyenlők
else
if [ $1 -lt $2 ]
then
echo "$2 - $1 = `expr $2 - $1`"
else
echo "$1 - $2 = `expr $1 - $2`"
fi
fi
**4.** Írjon szkriptet ''gyak4.sc'' néven, ami a ellenőrzi, hogy három paraméterrel futtatjuk és a paraméterek közül egyik sem nagyobb mint 90. Futtatáskor figyelmeztessen a paraméterek nem megfelelő számára vagy értékére. Megfelelő paraméterek esetén a ''Paraméterek rendben!'' szöveg jelenjen meg.
#!/bin/bash
if [ $# -eq 3 ]
then
if test "$1" -le 90 -a "$2" -le 90 -a "$3" -le 90
then
echo "A paraméterek megfelelők"
else
echo "Nem megfelelő a paraméterek értéke"
fi
else
echo "A paraméterek száma nem megfelelő"
fi
Mivel itt három feltételnek kell egyszerre érvényesülnie, a feltételek között logikai ÉS függvény van. Bonyolultabb feltételek esetén könnyebben értelmezhető a feltételes utasítás, ha szögletes zárójeleket valamint ''a && - logikai és'' és a ''|| - logikai vagy'' operátorokat használunk. A fenti példa ebben a beírásban:
if [ $1 -le 90 ] && [ $2 -le 90 ] && [ $3 -le 90 ]
Amennyiben a feltétel az lenne, hogy paraméterek közül legalább egy nagyobb mint 90, akkor azt így adhatnánk meg:
if [ $1 -le 90 ] || [ $2 -le 90 ] || [ $3 -le 90 ]
**5.** Írjon szkriptet, ami megjeleníti a Húsvét vasárnap dátumát a paraméterében megadott évben. Jelenjen meg mind a nyugati, mind az ortodox egyház ünnepének dátuma. Amennyiben ez a két dátum egybeesik, csak egyszer jelenjen meg.\\
Linuxban az ''ncal'' pranccsal tudjuk ezeket az adatokat megjeleníteni. A ''man ncal'' paranccsal jelenítsük meg és olvassuk el a parancs használatát és opcióit. Kilépés '' q'' billentyű.\\
(az ''ncal'' parancs Ubuntu és Debian Linux disztribúciókban alapértelmezetten megtalálható)
#!/bin/bash
HN=`ncal -e $1`
HO=`ncal -o $1`
if test "$HN" = "$HO"
then
echo "Húsvét vasárnap: $HN"
else
echo "Húsvét vasárnap a nyugati egyházban: $HN"
echo "Húsvét vasárnap az ortodox egyházban: $HO"
fi
A változókat a test parancsban idézőjelekkel kell írnunk, mert a dátum szóközöket tartalmaz.
[[st-linux_alapok:st-linux_alapok|< Vissza]]