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 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
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 |
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 |
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 |
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 |
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.