Skip to main content

Come passare argomenti a uno script Bash

Corso di terminale linux - la shell (Aprile 2025)

Corso di terminale linux - la shell (Aprile 2025)
Anonim

È possibile scrivere uno script bash in modo che riceva argomenti specificati quando lo script viene chiamato dalla riga di comando. Questo metodo viene utilizzato quando uno script deve eseguire una funzione leggermente diversa a seconda dei valori dei parametri di input (gli argomenti).

Ad esempio, potresti avere uno script chiamato "stats.sh" che esegue una particolare operazione su un file, come contare le sue parole. Se si desidera poter utilizzare lo script su molti file, è consigliabile passare il nome del file come argomento, in modo da poter utilizzare lo stesso script per tutti i file da elaborare. Ad esempio, se il nome del file da elaborare è "songlist", devi inserire la seguente riga di comando:

sh stats.sh songlist

Si accede agli argomenti all'interno di uno script usando le variabili $ 1, $ 2, $ 3, ecc., Dove $ 1 si riferisce al primo argomento, $ 2 al secondo argomento e così via. Questo è illustrato nel seguente esempio:

FILE1 = $ 1wc $ FILE1

Per la leggibilità, assegnare una variabile con un nome descrittivo al valore del primo argomento ($ 1), quindi chiamare la parola utilità di conteggio (wc) su questa variabile ($ FILE1).

Se si dispone di un numero variabile di argomenti, è possibile utilizzare la variabile "$ @", che è una matrice di tutti i parametri di input. Ciò significa che è possibile utilizzare un ciclo for per elaborare iterativamente ciascuno di essi, come illustrato nell'esempio seguente:

per FILE1 in "$ @"farewc $ FILE1fatto

Ecco un esempio di come chiamare questo script con argomenti dalla riga di comando:

sh stats.sh songlist1 songlist2 songlist3

Se un argomento ha spazi, è necessario racchiuderlo tra virgolette singole. Per esempio:

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

Spesso uno script è scritto in modo tale che l'utente possa passare argomenti in qualsiasi ordine usando i flag. Con il metodo flags, puoi anche rendere opzionali alcuni argomenti.

Supponiamo tu abbia uno script che recuperi informazioni da un database in base a parametri specifici, come "username", "date" e "product", e generi un report in un "formato" specificato. Ora vuoi scrivere il tuo script in modo che tu possa passare questi parametri quando viene chiamato lo script. Potrebbe assomigliare a questo:

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

Bash abilita questa funzionalità con la funzione "getopts". Per l'esempio sopra, potresti usare getopts come segue:

mentre getopts u: d: p: f: opzionefarecaso "$ {opzione}"nelu) USER = $ {OPTARG} ;;d) DATA = $ {OPTARG} ;;p) PRODOTTO = $ {OPTARG} ;;f) FORMAT = $ OPTARG ;;esacfatto

Questo è un ciclo while che usa la funzione "getopts" e una cosiddetta "optstring", in questo caso "u: d: p: f:", per scorrere gli argomenti. Il ciclo while percorre la stringa optstring, che contiene i flag che possono essere utilizzati per passare argomenti, e assegna il valore dell'argomento fornito per quel flag alla variabile "option". La case-statement assegna quindi il valore della variabile "option" a una variabile globale che può essere utilizzata dopo che tutti gli argomenti sono stati letti.

I due punti nella stringa optstring indicano che sono necessari i valori per i flag corrispondenti. Nell'esempio sopra tutti i flag sono seguiti da due punti: "u: d: p: f:". Questo significa che tutte le bandiere hanno bisogno di un valore. Se, ad esempio, i flag "d" e "f" non dovessero avere un valore, la stringa di optstring sarebbe "u: dp: f".

Un due punti all'inizio della stringa di optstring, ad esempio ": u: d: p: f:", ha un significato completamente diverso. Ti permette di gestire i flag che non sono rappresentati nella stringa optstring. In questo caso il valore della variabile "opzione" è impostato su "?" e il valore di "OPTARG" è impostato sul flag imprevisto. Permette di visualizzare un messaggio di errore adatto per informare l'utente dell'errore.

Gli argomenti che non sono preceduti da un flag vengono ignorati da getopts. Se i flag specificati in optstring non vengono forniti quando viene chiamato lo script, non accade nulla, a meno che non si gestisca specificamente questo caso nel codice. Qualsiasi argomento non gestito da getop può ancora essere catturato con le normali variabili $ 1, $ 2, ecc.