Osta tämä Shell-skriptiopas PDF-tiedostona vain 5 dollarilla
Testiä käytetään käytännössä jokaisessa kirjoitetussa shell-skriptissä. Se ei ehkä näytä siltä, koskatest
ei useinkaan kutsuta suoraan. test
kutsutaan järjestelmässäsi useammin
if SPACE
Test is a simple but powerful comparison utility. For full details, run man test
:ksi, mutta tässä on muutamia käyttötapoja ja tyypillisiä esimerkkejä.
Testiä kutsutaan useimmiten epäsuorasti if
- ja while
-lausekkeiden kautta. Se on myös syy siihen, että joudut vaikeuksiin, jos luot ohjelman nimeltä test
ja yrität ajaa sitä, koska tätä komentotulkin sisäänrakennettua ohjelmaa kutsutaan ohjelmasi sijasta!
Syntaksi if...then...else...
on:
if then # if-codeelse # else-codefi
if ; then # do somethingfi
Voit käyttää myös elif
, esimerkiksi näin:
if ; then echo "Something" elif ; then echo "Something else" else echo "None of the above"fi
Kokeile seuraavaa koodinpätkää, ennen kuin suoritat sen, aseta muuttuja X erilaisiin arvoihin (kokeile -1, 0, 1, haloo, hei, hei jne.). Voit tehdä tämän seuraavasti (kiitos Davelle siitä, että hän huomautti muuttujan viennin tarpeesta, kuten kohdassaMuuttujat - Osa I todettiin):
$ 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 ...
Kokeile sitten uudestaan, kun $X
on olemassa olevan tiedoston nimi, esimerkiksi /etc/hosts
.
test.sh
Huomaa, että voimme käyttää puolipistettä (;
) kahden rivin yhdistämiseen. Näin tehdään usein, kun halutaan säästää hieman tilaa yksinkertaisissa if
-lausekkeissa.
Takaviivalla (\
) on samanlainen, mutta päinvastainen tarkoitus: se kertoo komentotulkille, että tämä ei ole rivin loppu, vaan että seuraavaa riviä on käsiteltävä osana nykyistä riviä. Tämä on hyödyllistä luettavuuden kannalta. Seuraavan rivin sisennys on tapana tehdä backslash-viivan (\
) tai puolipisteen (;
) jälkeen.
Esimerkiksi puolipistettä (;
) käytetään usein näin yhdistämään avainsanat if
ja then
:
if ; then echo "X is a file which is newer than /etc/passwd"fi
, kun taas takaviivaa (\
) käytetään jakamaan yksirivinen komento kahdelle riville komentosarjatiedostossa luettavuuden vuoksi:
&& \ echo "X is a file which is newer than /etc/passwd"
Kuten näemme näistä esimerkeistä, test
voi suorittaa monia testejä numeroille, merkkijonoille ja tiedostonimille.
On olemassa yksinkertaisempi tapa kirjoittaa if
-lauseet: Komennot &&
ja ||
antavat koodin, joka suoritetaan, jos tulos on tosi tai epätosi.
Tämä syntaksi on mahdollinen, koska on olemassa tiedosto (tai komentotulkin rakentama) nimeltä , jonka rakennetta suositellaan while-silmukoille ja triviaaleille saniteettitarkistuksille, joilla ei haluta häiritä lukijaa liikaa.
Huomaa, että kun asetat X:n muuhun kuin numeeriseen arvoon, muutamat ensimmäiset vertailut johtavat viestiin:
Tämä johtuu siitä, että -lt-, -gt-, -le- ja -ge-vertailut on suunniteltu vain kokonaisluvuille, eivätkä ne toimi merkkijonoille. Merkkijonovertailut, kuten !=
, käsittelevät mielellään "5" merkkijonona, mutta ei ole mitään järkevää tapaa käsitellä "Hello" kokonaislukuna, joten kokonaislukujen vertailut valittavat.
Jos haluat komentosarjakomentosarjasi käyttäytyvän tyylikkäämmin, sinun on tarkistettava muuttujan sisältö ennen sen testaamista - ehkä jotenkin näin:
Siten voit echo
antaa käyttäjälle mielekkäämmän viestin ja poistua sirosti. Muuttuja $?
on selitetty kohdassa Muuttujat - Osa II, ja grep
on monimutkainen peto, joten tässä sitä mennään: grep
löytää tekstirivejä, jotka sisältävät numeroita (0-9) ja mahdollisesti muita merkkejä, joten grep
:ssa oleva caret (^
) löytää vain ne rivit, jotka eivät koostu vain numeroista. Voimme sitten ottaa päinvastaisen vaihtoehdon (toimimalla epäonnistumisen, ei onnistumisen perusteella). Onko selvä? >/dev/null 2>&1
ohjaa kaikkiulostulot tai virheet erityiseen "null"-laitteeseen sen sijaan, että ne menisivät käyttäjän näytölle.
Monet kiitokset Paul Schermerhornille oikaisusta - tällä sivulla väitettiin aiemmin, että grep -v
toimisi, mutta tämä on selvästi aivan liian yksinkertaista.
Voidaan käyttää testiä while-silmukoissa seuraavasti:
test2.sh
#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X echo "You said: $X"done
Tämä koodi kysyy syötettä niin kauan, kunnes painetaan RETURN (X on nollan pituinen).Kiitos Justin Heathille siitä, että hän huomautti, että skripti ei toiminut - olin unohtanut lainausmerkit $X:n ympäriltä while
. Ilman näitä lainausmerkkejä ei ole mitään testattavaa, kun $X on tyhjä.
Alexander Weber on huomauttanut, että tämän skriptin suorittaminen päättyy epäsiististi:
Tämä voidaan siistiä toisella testillä silmukan sisällä:
#!/bin/shX=0while do echo "Enter some text (RETURN to quit)" read X if ; then echo "You said: $X" fidone
Huomaa myös, että olen käyttänyt tällä sivulla kahta eri syntaksia if
-lauseille. Nämä ovat:
if then echo "X is less than zero"fi.......... and ........if ; then echo "You said: $X"fi
Siellä on oltava tauko if
-lauseen ja then
-konstruktion välissä. Tämä voi olla puolipiste tai uusi viiva, sillä ei ole väliä kumpi, mutta if
- ja then
-lausekkeiden välissä on oltava jompikumpi.Olisi mukavaa sanoa vain:
if echo "You said: $X"
mutta then
ja fi
ovat ehdottoman välttämättömiä.
Back: Silmukat Seuraava: Case