Aceasta este construcția de utilizat pentru a lua un curs de acțiune dacă comenzile if testează adevărat și altul dacă testează false. Un exemplu:

cazul

freddy scripts> gender = "male" freddy scripts> if [["$ gender" == "f *"]] Mai multe informații> atunci ecou „Plăcerea de a vă cunoaște, madame”. Mai multe informații> altfel ecou "Cum se face că doamna nu a băut încă?" Mai multe informații> fi Cum se face că doamna nu a băut încă? scripturi freddy>

Spre deosebire de [, [[împiedică împărțirea cuvintelor valorilor variabile. Deci, dacă VAR = "var cu spații", nu trebuie să citiți dublu VAR $ într-un test - deși folosirea ghilimelelor rămâne un obicei bun. De asemenea, [[previne extinderea căii de acces, așa că șirurile literal cu metacaracter nu încearcă să se extindă la nume de fișiere. Folosind [[, == și! = Interpretează șirurile din dreapta ca modele de glob de shell care trebuie asortate cu valoarea din stânga, de exemplu: [["valoare" == val *]] .

La fel ca lista CONSEQUENT-COMMANDS care urmează declarației de atunci, lista ALTERNATE-CONSEQUENT-COMMANDS care urmează instrucțiunii else poate conține orice comandă în stil UNIX care returnează o stare de ieșire.

Un alt exemplu, extinzându-l pe cel din secțiunea 7.1.2.1:

> su - Parolă: [root @ elegance root] # if! grep ^ $ USER/etc/passwd 1>/dev/null> apoi ecou "contul dvs. de utilizator nu este gestionat local"> altfel ecou "contul dvs. este gestionat din fișierul local/etc/passwd"> fi contul dvs. este gestionat din fișierul local/etc/passwd [root @ elegance root] #

Trecem la contul rădăcină pentru a demonstra efectul declarației else - rădăcina dvs. este de obicei un cont local, în timp ce propriul dvs. cont de utilizator ar putea fi gestionat de un sistem central, cum ar fi un server LDAP.

În loc să setați o variabilă și apoi să executați un script, este adesea mai elegant să puneți valorile variabilelor pe linia de comandă.

Folosim parametrii de poziție $ 1, $ 2,. $ N în acest scop. $ # se referă la numărul de argumente din linia de comandă. $ 0 se referă la numele scriptului.

Următorul este un exemplu simplu:

Figura 7-1. Testarea unui argument de linie de comandă cu if

Iată un alt exemplu, folosind două argumente:

> cat weight.sh #!/bin/bash # Acest script tipărește un mesaj despre greutatea dvs. dacă îi dați greutatea dvs. în kilograme și înălțimea în centimetri. weight = "$ 1" height = "$ 2" idealweight = $ [$ height - 110] if [$ weight -le $ idealweight]; apoi ecou „Ar trebui să mănânci ceva mai mult grăsime”. altfel ecou „Ar trebui să mănânci ceva mai mult fruct.” fi anny

> bash -x weight.sh 55 169 + weight = 55 + height = 169 + idealweight = 59 + '[' 55 -le 59 ']' + echo 'Ar trebui să mănânci ceva mai mult grăsime.' Ar trebui să mănânci ceva mai mult grăsime.

Următorul exemplu arată cum să modificați scriptul anterior, astfel încât acesta să imprime un mesaj dacă sunt date mai mult sau mai puțin de 2 argumente:

> cat weight.sh #!/bin/bash # Acest script tipărește un mesaj despre greutatea dvs. dacă îi dați greutatea dvs. în kilograme și înălțimea în centimetri. dacă [! $ # == 2]; apoi ecou „Utilizare: $ 0 weight_in_kilos length_in_centimeters” exit fi weight = "$ 1" height = "$ 2" idealweight = $ [$ height - 110] if [$ weight -le $ idealweight]; apoi ecou „Ar trebui să mănânci ceva mai mult grăsime”. altfel ecou „Ar trebui să mănânci ceva mai mult fruct.” fi anny

> greutate.sh 70 150 Ar trebui să mănânci un pic mai mult fruct. Anny

> weight.sh 70 150 33 Utilizare: ./weight.sh weight_in_kilos length_in_centimeters

Primul argument este denumit 1 $, al doilea ca 2 $ și așa mai departe. Numărul total de argumente este stocat în $ # .

Acest test se face într-o mulțime de scripturi, deoarece nu are rost să pornești o mulțime de programe dacă știi că nu vor funcționa:

#!/bin/bash # Acest script oferă informații despre un fișier. FILENAME = "$ 1" echo "Proprietăți pentru $ FILENAME:" dacă [-f $ FILENAME]; apoi ecou "Dimensiunea este $ (ls -lh $ FILENAME | awk '< print $5 >') "echo" Tipul este $ (fișier $ FILENAME | cut -d ":" -f2 -) "echo" Numărul codului este $ (ls -i $ FILENAME | cut -d " -f1 -) "echo" $ (df ​​-h $ FILENAME | grep -v Montat | awk '< print "On",$1", \ which is mounted as the",$6,"partition.">') "else echo" Fișierul nu există. "fi

Rețineți că fișierul se referă la utilizarea unei variabile; în acest caz este primul argument al scriptului. Alternativ, atunci când nu sunt date argumente, locațiile fișierelor sunt de obicei stocate în variabile la începutul unui script, iar conținutul lor este menționat folosind aceste variabile. Astfel, atunci când doriți să schimbați un nume de fișier într-un script, trebuie să o faceți o singură dată.

Numele de fișiere cu spații

Exemplul de mai sus va eșua dacă valoarea de $ 1 poate fi analizată ca mai multe cuvinte. În acest caz, comanda if poate fi reparată fie folosind ghilimele duble în jurul numelui fișierului, fie folosind [[în loc de [ .

Aceasta este forma completă a declarației if:

dacă TEST-COMANDE; apoi

elif MORE-TEST-COMMANDS; apoi

Lista TEST-COMMANDS este executată și dacă starea sa de returnare este zero, se execută lista CONSEQUENT-COMMANDS. Dacă TEST-COMMANDS returnează o stare diferită de zero, fiecare listă elif este executată la rândul său, iar dacă starea sa de ieșire este zero, se execută MORE-CONSEQUENT-COMMANDS corespunzătoare și comanda se finalizează. Dacă altceva este urmat de o listă ALTERNATE-CONSEQUENT-COMMANDS și de comanda finală din clauza final if sau elif are o stare de ieșire diferită de zero, atunci se execută ALTERNATE-CONSEQUENT-COMMANDS. Starea de returnare este starea de ieșire a ultimei comenzi executate sau zero dacă nicio condiție nu este testată adevărată.

Acesta este un exemplu pe care îl puteți pune în crontab pentru executarea zilnică:

anny /etc/cron.daily> cat disktest.sh #!/bin/bash # Acest script face un test foarte simplu pentru verificarea spațiului pe disc. space = `df -h | awk '' | grep% | grep -v Utilizați | sortează -n | coada -1 | cut -d "%" -f1 -` alertvalue = "80" if ["$ space" -ge "$ alertvalue"]; apoi ecou „Cel puțin unul dintre discurile mele este aproape plin!” | mail -s „disccheck zilnic” rădăcină altfel ecou „Spațiu pe disc normal” | mail -s "diskcheck zilnic" rădăcină fi

În cadrul instrucțiunii if, puteți utiliza o altă instrucțiune if. Puteți utiliza cât mai multe niveluri de imbricare dacă puteți gestiona logic.

Acesta este un exemplu de testare a anilor bisecți:

/ testdir> cat testleap.sh #!/bin/bash # Acest script va testa dacă suntem într-un an bisect sau nu. year = `data +% Y` if [$ [$ year% 400] -eq" 0 "]; apoi ecou "Acesta este un an bisect. Februarie are 29 de zile." elif [$ [$ year% 4] -eq 0]; atunci dacă [$ [$ year% 100] -ne 0]; apoi ecou „Acesta este un an bisect, februarie are 29 de zile”. else echo "Acesta nu este un an bisect. Februarie are 28 de zile." fi else echo "Acesta nu este un an bisect. Februarie are 28 de zile." fi anny

/ testdir> data Mar 14 ianuarie 20:37:55 CET 2003 an

/ testdir> testleap.sh Acesta nu este un an bisect.

Scriptul de mai sus poate fi scurtat folosind operatorii booleni „ȘI” (&&) și „SAU” (||).

Figura 7-2. Exemplu folosind operatori booleni

Printre alți editori, gvim este una dintre acele scheme de culori care acceptă formatul de fișier; astfel de editori sunt utili pentru detectarea erorilor din codul dvs.

Declarația exit acceptă un argument opțional. Acest argument este codul de stare de ieșire întreg, care este transmis înapoi părintelui și stocat în $? variabil.

Un argument zero înseamnă că scriptul a rulat cu succes. Orice altă valoare poate fi utilizată de programatori pentru a transmite părinților mesaje diferite, astfel încât să poată fi întreprinse acțiuni diferite în funcție de eșecul sau succesul procesului copil. Dacă nu este dat niciun argument comenzii exit, shell-ul părinte folosește valoarea curentă a $? variabil.

Mai jos este un exemplu cu un script penguin.sh ușor adaptat, care își trimite starea de ieșire înapoi către părinte, feed.sh:

/ testdir> cat penguin.sh #!/bin/bash # Acest script vă permite să prezentați diferite meniuri către Tux. El va fi fericit doar # când i se va da un pește. Am adăugat și un delfin și (probabil) o cămilă. if ["$ menu" == "pește"]; atunci dacă ["$ animal" == "pinguin"]; apoi ecou "Hmmmmmm pește. Tux fericit!" elif ["$ animal" == "delfin"]; apoi ecou „Pweetpeettreetppeterdepweet!” else echo "* prrrrrrrt *" fi else if ["$ animal" == "pinguin"]; apoi ecou "Tux nu-i place asta. Tux vrea pește!" exit 1 elif ["$ animal" == "delfin"]; apoi ecou „Pweepwishpeeterdepweet!” exit 2 else ecou "Vei citi acest semn?!" ieșirea 3 fi fi

Acest script este apelat în următorul, care, prin urmare, își exportă variabilele meniu și animal:

/ testdir> cat feed.sh #!/bin/bash # Acest script acționează asupra stării de ieșire dată de penguin.sh export menu = "$ 1" export animal = "$ 2" feed = "/ nethome/anny/testdir/pinguin. sh "$ feed $ meniu $ husa pentru animale $? în 1) ecou „Pază: Mai bine îmi dai un pește, mai puțin devin violenți.”; 2) ecou „Pază: datorită oamenilor ca tine, părăsesc pământul tot timpul.”; 3) ecou „Pază: cumpără mâncarea pe care grădina zoologică o oferă animalelor, tu ***, cum crezi că supraviețuim?”; *) ecou „Pază: Nu uitați de ghid!”; esac anny

/ testdir> ./feed.sh apple pinguin Tux nu-i place asta. Tux vrea pește! Paznic: Mai bine îmi dai un pește, mai puțin devin violenți.

După cum puteți vedea, codurile de stare de ieșire pot fi alese liber. Comenzile existente au de obicei o serie de coduri definite; consultați manualul programatorului pentru fiecare comandă pentru mai multe informații.

© iro.waykun.com 2024.