Felhasználói eszközök

Eszközök a webhelyen


st-linux_alapok:fejezetek:felteteles-utasitasok

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.

< Vissza

st-linux_alapok/fejezetek/felteteles-utasitasok.txt · Utolsó módosítás: 2016/05/01 03:01 szerkesztette: pferi