Vásárolja meg ezt a Shell Scripting Tutorialt PDF-ben mindössze 5 dollárért

A tesztet gyakorlatilag minden megírt shell script használja. Talán nem így tűnik, mert atest nem gyakran hívják közvetlenül. A test gyakrabban hívják

if SPACE 

Test is a simple but powerful comparison utility. For full details, run man testként a rendszereden, de íme néhány felhasználási mód és tipikus példa.

A

Testet leggyakrabban közvetve hívják meg a if és awhile utasításokon keresztül. Ez az oka annak is, hogy nehézségekbe fogsz ütközni, ha létrehozol egy test nevű programot, és megpróbálod futtatni, mivel ez a beépített héjprogram lesz meghívva a programod helyett!
A if...then...else... szintaxisa:

if then # if-codeelse # else-codefi
if ; then # do somethingfi

Az elif-t is használhatod, így:

if ; then echo "Something" elif ; then echo "Something else" else echo "None of the above"fi

Kipróbáld az alábbi kódrészletet, futtatás előtt állítsd be az X változót különböző értékekre (próbáld ki a -1, 0, 1, hello, bye, stb). Ezt a következőképpen teheti meg (köszönet Dave-nek, hogy rámutatott a változó exportálásának szükségességére, amint azt aVáltozók - I. résznél megjegyeztük):

$ X=5$ export X$ ./test.sh ... output of test.sh ...$ X=hello$ ./test.sh ... output of test.sh ...$ X=test.sh$ ./test.sh ... output of test.sh ...

Majd próbálja meg újra, $X egy meglévő fájl nevével, például /etc/hosts.

test.sh

Megjegyezzük, hogy a pontosvesszőt (;) használhatjuk két sor összekapcsolására. Ezt gyakran azért tesszük, hogy egy kis helyet takarítsunk meg az egyszerű if utasításokban.
A backslash (\) hasonló, de ellentétes célt szolgál: azt üzeni a shellnek, hogy ez nem a sor vége, hanem hogy a következő sort az aktuális sor részeként kell kezelni. Ez az olvashatóság szempontjából hasznos. A következő sort a backslash (\) vagy pontosvessző (;) után szokás behúzni.

A pontosvesszőt (;) például gyakran használják így a if és then kulcsszavak összekapcsolására:

if ; then echo "X is a file which is newer than /etc/passwd"fi

míg a backslash (\) arra szolgál, hogy a shell script fájlban az olvashatóság érdekében az egysoros parancsot két sorra osszuk:

 && \ echo "X is a file which is newer than /etc/passwd"

Amint ezekből a példákból láthatjuk, a test számos vizsgálatot végezhet számokon, karakterláncokon és fájlneveken.

A if utasítások írásának van egy egyszerűbb módja is: A && és || parancsok olyan kódot adnak meg, amely akkor fut le, ha az eredmény igaz, illetve hamis.

Ez a szintaxis azért lehetséges, mert létezik egy nevű fájl (vagy shell-builtin) konstrukció, amelyet while ciklusokhoz és triviális szanitycheckekhez ajánlunk, amelyekkel nem akarjuk túlzottan megzavarni az olvasót.

Megjegyezzük, hogy amikor az X-et nem numerikus értékre állítjuk, az első néhány összehasonlítás a következő üzenetet eredményezi:

Ez azért van, mert a -lt, -gt, -le és -ge összehasonlítások csak egész számokra vannak tervezve, és nem működnek karakterláncokon. A string összehasonlítások, mint például a != boldogan kezeli az "5"-öt stringként, de nincs ésszerű módja annak, hogy a "Hello"-t egész számként kezelje, így az integer összehasonlítások panaszkodnak.
Ha azt akarod, hogy a shell szkripted kegyesebben viselkedjen, akkor ellenőrizni kell a változó tartalmát, mielőtt teszteled - talán valami ilyesmi:

Így tudsz echo egy értelmesebb üzenetet adni a felhasználónak, és méltóságteljesen kilépni. A $? változót a Változók - II. rész ismerteti, a grep pedig egy bonyolult állat, úgyhogy íme: A grep olyan szövegsorokat talál, amelyek számjegyeket (0-9) és esetleg más karaktereket tartalmaznak, így a grep -ben lévő caret (^) csak azokat a sorokat találja meg, amelyek nem csak számokból állnak. Ezután vehetjük az ellenkezőjét (a sikertelenségre, nem a sikerre hatva). Rendben? A >/dev/null 2>&1 minden kimenetet vagy hibát a speciális "null" eszközre irányít, ahelyett, hogy a felhasználó képernyőjére kerülne.
Nagy köszönet Paul Schermerhornnak, hogy kijavított - ez az oldal korábban azt állította, hogy a grep -v működne, de ez nyilvánvalóan túlságosan leegyszerűsített.

A while ciklusokban a következőképpen használhatjuk a tesztet:

test2.sh

#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X echo "You said: $X"done

Ez a kód addig kér bevitelt, amíg le nem nyomjuk a RETURN-t (X nulla hosszúságú).Köszönöm Justin Heathnek, hogy rámutatott, hogy a szkript nem működik - kihagytam az idézőjeleket a $X körül a while -ben. Az idézőjelek nélkül nincs mit tesztelni, ha $X üres.
Alexander Weber rámutatott, hogy ennek a szkriptnek a futtatása rendezetlenül fog végződni:

Ezt egy másik teszttel lehet rendbe tenni a cikluson belül:

#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X if ; then echo "You said: $X" fidone

Megjegyzem azt is, hogy két különböző szintaxist használtam a if utasításokhoz ezen az oldalon. Ezek a következők:

if then echo "X is less than zero"fi.......... and ........if ; then echo "You said: $X"fi

A if utasítás és a then konstrukció között szünetnek kell lennie. Ez lehet pontosvessző vagy újsor, nem számít, hogy melyik, de a if és a then között lennie kell az egyiknek vagy a másiknak.Jó lenne, ha csak annyit mondanánk:

if echo "You said: $X"

de a then és a fi feltétlenül szükséges.


Back: Hurok Következő:

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.