
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