Cum să transmiteți și să analizați argumentele și parametrii scriptului Linux Bash
Analiza și trecerea argumentelor în scripturi bash/scripturi shell este destul de similară cu modul în care transmitem argumente funcțiilor din scripturile Bash. Vom vedea procesul real de transmitere a argumentelor unui script și, de asemenea, vom analiza modul de accesare a acestor argumente în interiorul scriptului.
Transmite argumente înainte de a rula
Putem trece parametrii imediat după numele scriptului în timp ce rulăm comanda bash interpreter. Puteți trece parametri sau argumente fișierului. Doar comanda pentru rularea normală a scriptului prin adăugarea valorii parametrilor direct la script. Fiecare parametru este o valoare separată de spațiu, care trebuie transmisă scriptului shell.
bash scriptname.sh
Comanda de mai sus va rula doar scriptul fără a trece parametrii.
În timp ce comanda de mai jos va transmite argumentele scriptului.
bash scriptname.sh parameter1 parameter2 parameter3 nth-parameter
Rularea scriptului bash cu parametrii de trecere
Captura de ecran de mai sus afișează parametrii trecuți scriptului, cum vom face asta, pe care îi vom explica în secțiunea următoare. Dar acum putem vedea că am trecut parametrii din afara scriptului folosind variabile de mediu bash. Puteți folosi chiar și șiruri de caractere și alte tipuri de date, dar aveți grijă la orice spațiu alb. Spațiul alb va face din variabilă un parametru separat. Așadar, în special pentru șiruri, aveți grijă să le înconjurați strict cu ghilimele.
Detectarea argumentelor liniei de comandă
Acum, vom vedea cum accesăm acești parametri în interiorul scriptului. Vom folosi numărul de parametri trecuți în ordine, adică pentru primii parametri trecuți, vom analiza (accesa) parametrul folosind $1 ca variabilă. Primul parametru este stocat în variabila $1. În plus, puteți atribui această variabilă oricărei alte variabile definite de utilizator doriți. Pentru al n-lea parametru trecut, puteți folosi $n pentru a accesa acel parametru particular. Aici, numele variabilei începe cu 1 deoarece numele fișierului/numele scriptului este al 0-lea parametru. Dacă aveți mai mult de 9 parametri, asigurați-vă că utilizați { } în jurul numărului ca fără paranteză, bash va vedea doar $10 ca $1 și va exclude 0, așa că utilizați ${10} și așa mai departe în loc de doar $10.
#!/bin/bash echo '1st parameter = $1 ' echo '2nd Parameter = $2 '
Scriptul de mai sus poate accesa parametrii din linia de comandă/shell folosind parametrii de poziție, care sunt 1, 2, 3 și așa mai departe.
Accesarea argumentelor din script.
După cum puteți vedea, am folosit {} pentru a accesa numerele de variabile ale parametrilor de la 10 în sus. Scriptul poate fi folosit pentru bucle și bucle while pentru a itera parametrii, dar îl vom discuta în secțiunile ulterioare.
Atribuiți argumentele furnizate variabilei Bash
De asemenea, îl putem atribui altor variabile personalizate pentru a face scriptul mai dinamic și a-l modela în funcție de nevoi. Deși scriptul de mai sus atunci când este rulat va imprima doar doi parametri, cu siguranță puteți accesa mai mulți parametri folosind variabila ca ordinea parametrilor în numere. Scriptul poate accesa variabilele de poziție din linia de comandă și le poate folosi în locurile necesare oriunde este necesar în cadrul scriptului.
#!/bin/bash a=$1 b=$2 p=$(($a*$b)) echo 'The product of $a and $b = $p'
Atribuiți argumentele furnizate variabilei Bash
Scriptul de mai sus accesează parametrii poziționali, adică $1 și $2 trecuți în script și stochează variabilele definite de utilizator pentru a le accesa mai târziu și a le modifica în consecință. De asemenea, putem accesa mai mulți parametri folosind metode iterative, așa cum vom vedea în secțiunile următoare.
Avem, de asemenea, capacitatea de a verifica dacă nu sunt parametrii NULL sau goli trecuți folosind steaguri -z sau -n. Din aceasta, putem verifica dacă parametrii au fost trecuți sau nu.
#!/bin/bash if [[ -z $1 ]]; then echo 'No parameter passed.' else echo 'Parameter passed = $1' fi
Verificarea parametrilor poziționali trecuți sau nu.
Cu acest script, putem detecta dacă au fost transferați parametri de poziție sau nu a fost trecut nimic. Indicatorul -z verifică orice variabile NULL sau neinițializate în BASH. Indicatorul -z returnează adevărat dacă variabila transmisă este NULL sau neinițializată. Prin urmare, putem folosi instrucțiunile de bază If-else pentru a detecta parametrii trecuți.
De asemenea, putem folosi -n flag care returnează adevărat dacă nu sunt transmise parametri, așa că trebuie să folosim ! pentru a inversa starea.
Cum urmează:
#!/bin/bash if [[ ! -n $1 ]]; then echo 'No parameter passed.' else echo 'Parameter passed = $1' fi
Acest script va oferi, de asemenea, aceeași ieșire, dar folosim -n flag în loc de -z.
Citirea mai multor argumente cu bucla For sau While
Putem folosi variabila @ pentru a accesa fiecare parametru transmis scriptului prin linia de comandă. Este o variabilă specială care deține matricea de variabile în BASH. În acest caz, îl folosim singur, deci conține matricea parametrilor de poziție trecuți. O putem folosi pentru a itera peste parametrii trecuți folosind bucle sau bucle while, de asemenea.
#!/bin/bash for i in $@ do echo -e '$i ' done
Folosind bucle și variabile @ pentru a accesa parametrii ca elemente de matrice.
Am folosit o buclă bazată pe intervale pentru a itera până când există elemente în tabloul @. Pur și simplu iterăm peste matrice și imprimăm elementul. Îl putem atribui pur și simplu, modifica valorile și face modificările necesare parametrilor și argumentelor pentru a obține rezultatul dorit din script.
SAU
De asemenea, putem imprima argumentele folosind bucla while și variabilele de mediu ale lui BASH.
#!/bin/bash i=$(($#-1)) while [ $i -ge 0 ]; do echo ${BASH_ARGV[$i]} i=$((i-1)) done
Folosind bucla while pentru a repeta peste parametrii trecuți.
Folosim variabila „ # „ deoarece conține numărul de parametri transmisi. Inițializam numărul de parametri și luăm unul, deoarece vom folosi o matrice pentru a itera peste el. Deci, ca de obicei, indexul matricei începe de la 0. Deoarece această matrice este inițializată de la ultimul element sau parametru trecut, trebuie să reducem contorul până la 0 pentru a imprima fiecare parametru în ordinea în care este transmis. Pur și simplu folosim matricea BASH_ARGV pentru a accesa parametrii și pentru a-i imprima valoarea. De asemenea, la fiecare iterație, scădem valoarea lui i- iteratorul sau contorul cu una folosind acoladele duble aritmetice. Din aceasta, pur și simplu tipărim fiecare parametru transmis scriptului folosind o buclă while așa cum se arată din captura de ecran de ieșire.
Citirea cu nume de parametri
Utilizarea getopts pentru a analiza argumente și parametri
Putem folosi programul/comanda getopts pentru a analiza argumentele transmise scriptului în linia de comandă/terminal folosind bucle și instrucțiuni switch-case.
#!/bin/bash while getopts n:c: option do case '${option}' in n)nation=${OPTARG};; c)code=${OPTARG};; esac done echo 'Nation : $nation' echo 'code : $code'
Utilizarea getopts pentru a analiza argumente și parametri
Folosind getopts, putem aloca argumentele/parametrii poziționali din linia de comandă variabilelor bash direct. Acest lucru ne permite să gestionăm parametrii frumos și într-un mod sistematic. În scriptul de mai sus, am folosit două argumente pentru a stoca variabilele bash folosind sintaxa getopts, bucle while și instrucțiuni switch-case.
Tipărirea valorilor tuturor argumentelor
Putem imprima argumentele transmise scriptului printr-o variabilă simplă puternică „@” care stochează toți parametrii trecuți.
#!/bin/bash echo 'The arguments passed in are : $@'
Tipărirea valorilor tuturor argumentelor
Accesarea numărului de parametri trecuți
De asemenea, putem folosi variabila „#” pentru a accesa numărul de parametri trecuți din linia de comandă. Variabila # conține practic numărul de parametri/argumente care sunt transmise în script.
#!/bin/bash echo 'The number of arguments passed in are : $#'
Accesarea numărului de parametri trecuți
Următoarele au fost procesul și specificațiile de trecere și parsare a variabilelor în scriptul bash. Logica de schimbare și de a face modificări la variabile este în mâinile utilizatorului. Aceasta a fost doar o demonstrație a transmiterii și analizei argumentelor din linia de comandă către script pentru a le face mai dinamice.