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

Vastaa

Sähköpostiosoitettasi ei julkaista.