Cum să treci argumentele într-un script Bash

Comenzi, sintaxă și exemple

Puteți scrie un script bash astfel încât să primească argumente specificate atunci când scriptul este apelat din linia de comandă. Această metodă este utilizată atunci când un script trebuie să efectueze o funcție ușor diferită în funcție de valorile parametrilor de intrare (argumentele).

De exemplu, este posibil să aveți un script numit "stats.sh" care efectuează o anumită operație pe un fișier, cum ar fi numărarea cuvintelor sale. Dacă doriți să puteți utiliza scriptul pe mai multe fișiere, cel mai bine este să transmiteți numele fișierului ca argument, astfel încât să puteți utiliza același script pentru toate fișierele care urmează să fie procesate. De exemplu, dacă numele fișierului care trebuie procesat este "listă de melodii", introduceți următoarea linie de comandă:

sh stats.sh lista de melodii

Argumentele sunt accesate într-un script utilizând variabilele $ 1, $ 2, $ 3 etc., unde $ 1 se referă la primul argument, $ 2 la al doilea argument și așa mai departe. Acest lucru este ilustrat în următorul exemplu:

FILE1 = $ 1 wc $ FILE1

Pentru lizibilitate, atribuiți o variabilă cu un nume descriptiv valorii primului argument ($ 1), apoi apelați utilitatea de numărare a cuvintelor ( wc ) pe această variabilă ($ FILE1).

Dacă aveți un număr variabil de argumente, puteți utiliza variabila "$ @", care este o matrice a tuturor parametrilor de intrare. Aceasta înseamnă că puteți folosi o buclă pentru a procesa iterativ fiecare, după cum se arată în exemplul următor:

pentru FILE1 în "$ @" fa wc $ FILE1 făcut

Iată un exemplu de cum se numește acest script cu argumente din linia de comandă:

sh stats.sh songlist1 songlist2 songlist3

Dacă un argument are spații, trebuie să îl includeți cu ghilimele simple. De exemplu:

sh stats.sh 'melodie 1' 'songlist 2' 'songlist 3'

Frecvent, un script este scris astfel încât utilizatorul să poată transmite argumente în orice ordine, folosind steaguri. Cu ajutorul metodei de semnalizare, puteți face și unele argumente opționale.

Spuneți că aveți un script care preia informații dintr-o bază de date pe baza parametrilor specificați, cum ar fi "nume de utilizator", "dată" și "produs", și generează un raport într-un "format" specificat. Acum doriți să vă scrieți scenariul astfel încât să puteți transmite acești parametri când este apelat scriptul. Ar putea să arate astfel:

makereport -u jsmith -p notebook -d 10-20-2011 -f pdf

Bash permite această funcționalitate cu funcția "getopts". Pentru exemplul de mai sus, ați putea folosi getopts după cum urmează:

Aceasta este o buclă care folosește funcția "getopts" și o așa-numită "optstring", în acest caz "u: d: p: f:", pentru a itera prin argumente. Ciclul de timp trece prin optstring, care conține steagurile care pot fi folosite pentru a transmite argumente și atribuie valoarea argumentului furnizată pentru acel stegulec variabilei "opțiune". Declarația de caz atribuie apoi valoarea variabilei "opțiune" unei variabile globale care poate fi utilizată după citirea tuturor argumentelor.

Colonii din optstring înseamnă că sunt necesare valori pentru steagurile corespunzătoare. În exemplul de mai sus, toate steagurile sunt urmate de un colon: "u: d: p: f:". Aceasta înseamnă că toate steagurile au nevoie de o valoare. Dacă, de exemplu, steagurile "d" și "f" nu ar trebui să aibă o valoare, optstring-ul ar fi "u: dp: f".

Un colon la începutul optstringului, de exemplu ": u: d: p: f:", are un înțeles complet diferit. Acesta vă permite să manipulați steaguri care nu sunt reprezentate în optstring. În acest caz, valoarea variabilei "opțiune" este setată la "?" iar valoarea "OPTARG" este setată la steagul neașteptat. Vă permite să afișați un mesaj de eroare adecvat informând utilizatorul despre greșeală.

Argumentele care nu sunt precedate de un steag sunt ignorate de getopts. Dacă nu sunt furnizate steaguri specificate în optstring atunci când este apelat scriptul, nu se întâmplă nimic, cu excepția cazului în care vă ocupați în mod special de acest caz în codul dvs. Orice argumente care nu sunt tratate de getso pot fi capturate cu variabilele obișnuite $ 1, $ 2, etc.