Funzioni Bash e variabili locali

Contenuti

Questo post dimostrerà come vengono utilizzate e create le funzioni delle variabili locali in Bash. La creazione di funzioni bash ti consente di rendere il tuo codice più strutturale, e le variabili locali aiutano con la sicurezza ed evitano errori di codifica. Gettarsi!

Quali sono Funzioni di bash?

Allo stesso modo di altri linguaggi di codifica, Bash ti consente di creare funzioni dal tuo codice o script. È possibile impostare un ruolo per eseguire un'attività specifica, o una serie di compiti, e può essere chiamato facilmente e velocemente dal tuo codice principale semplicemente usando il nome dato alla funzione.

Puoi anche annidare le chiamate di funzione (chiamare una funzione dall'interno di un'altra funzione), utilizzare le variabili locali all'interno della funzione e persino passare le variabili avanti e indietro con le funzioni, o attraverso l'uso di variabili globali. esploriamo.

funzione a colpo singolo

Definiamo un test.sh con il nostro editor di testo, nel prossimo modo:

#!/bin/bash

welcome(){
eco "Benvenuto"
}

Benvenuto

Successivamente, rendiamo quel file eseguibile aggiungendo l'esecuzione (x) proprietà ed eseguire lo script:

chmod +x test.sh
./test.sh

Una semplice funzione Bash

Possiamo vedere come lo script imposta prima a welcome() funzione utilizzando idiomi Bash function_name(), e {} wrapper di funzioni. In conclusione, chiamiamo welcome alla funzione semplicemente usando il suo nome, welcome.

Quando lo script viene eseguito, ciò che accade in background è che la definizione della funzione è annotata, ma è omesso (In altre parole, non funziona), fino a poco più in basso la chiamata di funzione. welcome viene battuto, e a che punto l'interprete Bash esegue il file welcome funzione e ritorna alla linea subito dopo la chiamata di funzione, che in questo caso è la fine del nostro copione.

Passaggio di variabili alle funzioni Bash

Definiamo un test2.sh con il nostro editor di testo preferito (noi;), nel prossimo modo:

#!/bin/bash

if [ -Insieme a "${1}" ]; then 
  echo "Un'opzione richiesta!"
  Uscita 1
fi

func1(){
  eco "${1}"
}

funzione2(){
  eco "${2} ${1}"
}

funzione1 "${1}"
funzione2 "un" "B"

Rendiamo nuovamente eseguibile il nostro script usando chmod +x test2.sh ed esegui lo stesso.

Una funzione Bash più avanzata con passo variabile

Il risultato risultante può sembrare interessante o addirittura confuso all'inizio.. Nonostante questo, è logico e facile da seguire. La prima opzione passata allo script sarà, globalmente, disponibile dal codice like ${1}, tranne le funzioni interne, dove ${1} diventa il primo parametro passato alla funzione, ${2} il secondo, eccetera.

In altre parole, il globale ${1} variabile (la prima opzione passata allo script dalla riga di comando) non abilitato dalle funzioni, dove il significato di ${1} La variabile cambia alla prima opzione passata alla funzione. Pensa alla gerarchia o pensa a come una funzione potrebbe presentare un piccolo script da sola e questo avrà presto un senso.

Come nota a margine, potrebbe anche essere usato $1 invece di ${1}, ma consiglio vivamente agli aspiranti programmatori bash di circondare sempre i nomi delle variabili con { e }.

Il motivo è che a volte, quando si utilizzano variabili in una stringa, come esempio, l'esecutore bash non può guarda dove finisce una variabile e parte del testo allegato può essere preso come parte del nome della variabile dove non lo è, che genera un output inaspettato. È anche più pulito e chiaro qual è l'intenzione, soprattutto quando si tratta di array e flag alternativi speciali.

Perciò, abbiamo iniziato il nostro programma con il ${1} variabile impostata su "first". Se guardi alla vocazione di func1, vedrai che passiamo quella variabile alla funzione, così il ${1} all'interno della funzione diventa ciò che era nel ${1} del programma, In altre parole "first", ed è per questo che la prima riga di output è in realtà first.

Allora chiamiamo func2 e abbiamo passato due thread "a" e "b" alla funzione. Questi in seguito diventano i ${1} e ${2} automaticamente all'interno del func2 funzione. Funzione interna, li stampiamo capovolti, e la nostra produzione si abbina molto bene con b a come seconda linea di partenza.

In conclusione, facciamo anche un controllo nella parte superiore del nostro script che assicura che un'opzione sia veramente passata al test2.sh script che controlla se "${1}" è vuoto o non usa il -z prova dentro if comando. Usciamo dallo script con un codice di uscita diverso da zero (exit 1) per indicare ai programmi chiamanti che qualcosa è andato storto.

Variabili locali e valori di ritorno

Per il nostro ultimo esempio, definiamo uno script test3.sh come segue:

#!/bin/bash

func3(){
  RETROMARCIA locale="$(eco "${1}" | rev)"
  eco "${INVERSIONE}"
}

INGRESSO="abc"
RETRO ="$(funzione3 "${INGRESSO}")"
eco "${INVERSIONE}"

Ancora una volta lo rendiamo eseguibile ed eseguiamo lo script. l'uscita è cba come ci si può aspettare scansionando il codice e annotando i nomi delle variabili, eccetera.

Esempio con variabili locali e valori di ritorno

Nonostante questo, il codice è complesso e richiede un po' di tempo per abituarsi. esploriamo.

Primo, definiamo una funzione func3 in cui creiamo una variabile locale chiamata REVERSE. Gli assegniamo un valore chiamando un sottolivello ($()), e dall'interno di questo sottolivello facciamo eco a ciò che è stato passato alla funzione (${1}) e canalizzare questa uscita su rev comando.

il rev Il comando stampa l'input ricevuto dalla pipe (in un altro modo) sottosopra. È anche interessante notare qui che il ${1} La variabile rimane all'interno della subshell! È passato integralmente.

Prossimo, ancora da dentro func3 funzione, stampiamo l'output. Nonostante questo, questo output non verrà inviato allo schermo, invece sarà catturato dalla nostra chiamata di funzione e, perché, memorizzato all'interno del 'globale’ REVERSE variabile.

Stabiliamo il nostro ingresso in "abc", Chiama a func3 lavorare di nuovo dall'interno di un sottolivello, passando il INPUT variabile, e assegnare l'uscita a REVERSE variabile. Si noti che non c'è assolutamente alcuna connessione tra il 'globale’ REVERSE variabile e Locale REVERSE variabile dentro lo script.

Considerando che qualsiasi variabile globale, compreso qualsiasi INVERSIONE verrà passato alla funzione, non appena viene definita una variabile locale con lo stesso nome, verrà utilizzata la variabile locale. Possiamo anche provare a vedere questo altro piccolo script test4.sh:

#!/bin/bash

func3(){
  RETROMARCIA locale="$(eco "${1}" | rev)"
  eco "${INVERSIONE}"
}

INGRESSO="abc"
RETRO ="test"
funzione3 "${INGRESSO}"
eco "${INVERSIONE}"

Esempio di funzione bash e variabile locale che esemplifica due dei punti di apprendimento visti finora

Quando corri, l'uscita è cba e test. il cba questa volta è generato dallo stesso echo "${REVERSE}" entro func3 funzione, ma questa volta viene emesso direttamente invece di essere catturato nel codice sottostante come il func3 "${INPUT}" La funzione non viene chiamata dall'interno di un sottolivello.

Questo script evidenzia due punti di apprendimento che abbiamo trattato in precedenza: primo, Quello, anche quando abbiamo stabilito il REVERSE variabile a "test" all'interno dello script prima di chiamare il func3 funzione – che lui Locale variabile REVERSE Prendi il controllo e usalo invece 'globale’ uno.

Al secondo posto, del nostro 'globale’ REVERSE la variabile mantiene il suo valore anche se c'era un Locale variabile con lo stesso nome usata all'interno della funzione chiamata func3.

Fine

Come potete vedere, le funzioni bash, passare le variabili, così come l'uso di variabili locali e semiglobali rendono il linguaggio di scripting Bash versatile, facile da codificare e ti dà l'opportunità di stabilire un codice ben strutturato.

Inoltre è degno di nota qui che, migliorando la leggibilità del codice e la facilità d'uso, l'utilizzo di variabili locali fornisce ulteriore sicurezza, poiché le variabili non saranno accessibili al di fuori del contesto di una funzione, eccetera. Goditi le variabili e le funzioni locali durante la codifica in Bash!!

Se sei interessato a saperne di più su Bash, vedere Come analizzare correttamente i nomi dei file in Bash e Utilizzo di xargs in combinazione con bash -c per creare comandi complessi.

Iscriviti alla nostra Newsletter

Non ti invieremo posta SPAM. Lo odiamo quanto te.