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 test
ké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ő: