Come lavorare con le variabili in Bash

Le variabili sono vitali se vuoi scrivere script e capire cosa farà il codice che stai per tagliare e incollare dal web sul tuo computer Linux. Ti faremo iniziare!

Variabili 101

Le variabili sono simboli denominati che rappresentano una stringa o un valore numerico. Quando li usi nei comandi e nelle espressioni, vengono trattati come se avessi digitato il valore che contengono invece del nome della variabile.

Per creare una variabile, è sufficiente fornire un nome e un valore per essa. I nomi delle tue variabili dovrebbero essere descrittivi e ricordarti il ​​valore che contengono. Un nome di variabile non può iniziare con un numero, né può contenere spazi. Tuttavia, può iniziare con un trattino basso. Oltre a questo, puoi utilizzare qualsiasi combinazione di caratteri alfanumerici maiuscoli e minuscoli.

Esempi

Qui creeremo cinque variabili. Il formato consiste nel digitare il nome, il segno di uguale = e il valore. Nota che non c’è uno spazio prima o dopo il segno di uguale. L’assegnazione di un valore a una variabile viene spesso definita come assegnazione di un valore alla variabile.

Creeremo quattro variabili stringa e una variabile numerica, this_year:

me=Dave
my_boost=Linux
him=Popeye
his_boost=Spinach
this_year=2019

Cinque variabili in una finestra di terminale.

Per vedere il valore tenuto in una variabile, usa il comando echo. È necessario far precedere il nome della variabile dal simbolo del dollaro $ ogni volta che si fa riferimento al valore in essa contenuto, come mostrato di seguito:

echo $my_name
echo $my_boost
echo $this_year

Il

Usiamo tutte le nostre variabili contemporaneamente:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

Il

I valori delle variabili sostituiscono i loro nomi. È inoltre possibile modificare i valori delle variabili. Per assegnare un nuovo valore alla variabile, my_boost, ripeti semplicemente quello che hai fatto quando hai assegnato il suo primo valore, in questo modo:

my_boost=Tequila

Il

Se riesegui il comando precedente, ora ottieni un risultato diverso:

echo "$my_boost is to $me as $his_boost is to $him (c) $this_year"

L'eco

Quindi, puoi usare lo stesso comando che fa riferimento alle stesse variabili e ottenere risultati diversi se modifichi i valori contenuti nelle variabili.

Più avanti parleremo della citazione delle variabili. Per ora, ecco alcune cose da ricordare:

Una variabile tra virgolette singole “viene trattata come una stringa letterale e non come una variabile.
Le variabili tra virgolette “vengono trattate come variabili.
Per ottenere il valore contenuto in una variabile, è necessario fornire il simbolo del dollaro $.
Una variabile senza il simbolo del dollaro $ fornisce solo il nome della variabile.

Esempi corretti e non corretti di riferimento a variabili in una finestra di terminale.

Puoi anche creare una variabile che prenda il suo valore da una variabile esistente o da un numero di variabili. Il comando seguente definisce una nuova variabile chiamata drink_of_the_Year e le assegna i valori combinati delle variabili my_boost e this_year:

drink_of-the_Year="$my_boost $this_year"
echo drink_of_the-Year

Il drink_of-the_Year =

Come utilizzare le variabili negli script

Gli script sarebbero completamente bloccati senza variabili. Le variabili forniscono la flessibilità che rende uno script una soluzione generale, piuttosto che specifica. Per illustrare la differenza, ecco uno script che conta i file nella directory / dev.

Digita questo in un file di testo, quindi salvalo come fcnt.sh (per “conteggio file”):

#!/bin/bash

folder_to_count=/dev

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Prima di poter eseguire lo script, devi renderlo eseguibile, come mostrato di seguito:

chmod +x fcnt.sh

Digita quanto segue per eseguire lo script:

./fcnt.sh

Stampa il numero di file nella directory / dev. Ecco come funziona:

Viene definita una variabile denominata folder_to_count, impostata per contenere la stringa “/ dev”.
Un’altra variabile, chiamata file_count, è definita. Questa variabile prende il suo valore da una sostituzione di comando. Questa è la frase di comando tra le parentesi $ (). Nota che c’è un segno di dollaro $ prima della prima parentesi. Questo costrutto $ () valuta i comandi tra parentesi e quindi restituisce il loro valore finale. In questo esempio, quel valore viene assegnato alla variabile file_count. Per quanto riguarda la variabile file_count, viene passato un valore da contenere; non si occupa di come è stato ottenuto il valore.
Il comando valutato nella sostituzione del comando esegue un elenco di file ls nella directory nella variabile folder_to_count, che è stata impostata su “/ dev”. Quindi, lo script esegue il comando “ls / dev”.
L’output di questo comando viene reindirizzato al comando wc. L’opzione -l (conteggio righe) fa sì che wc a contare il numero di righe nell’output del comando ls. Poiché ogni file è elencato su una riga separata, questo è il conteggio dei file e delle sottodirectory nella directory “/ dev”. Questo valore viene assegnato alla variabile file_count.
L’ultima riga usa l’eco per produrre il risultato.

Ma questo funziona solo per la directory “/ dev”. Come possiamo far funzionare lo script con qualsiasi directory? Tutto ciò che serve è un piccolo cambiamento.

Come utilizzare i parametri della riga di comando negli script

Molti comandi, come ls e wc, accettano parametri della riga di comando. Questi forniscono informazioni al comando, quindi sa cosa vuoi che faccia. Se vuoi che ls lavori sulla tua home directory e anche per mostrare i file nascosti, puoi usare il seguente comando, dove la tilde ~ e l’opzione -a (all) sono parametri della riga di comando:

ls ~ -a

I nostri script possono accettare parametri della riga di comando. Sono indicati come $ 1 per il primo parametro, $ 2 come secondo e così via, fino a $ 9 per il nono parametro. (In realtà, c’è anche $ 0, ma è riservato per tenere sempre lo script.)

Puoi fare riferimento ai parametri della riga di comando in uno script proprio come faresti con le variabili normali. Modifichiamo il nostro script, come mostrato di seguito, e salviamolo con il nuovo nome fcnt2.sh:

#!/bin/bash

folder_to_count=$1

file_count=$(ls $folder_to_count | wc -l)

echo $file_count files in $folder_to_count

Questa volta, alla variabile folder_to_count viene assegnato il valore del primo parametro della riga di comando, $ 1.

Il resto della sceneggiatura funziona esattamente come prima. Piuttosto che una soluzione specifica, il tuo script ora è generale. Puoi usarlo su qualsiasi directory perché non è codificato per funzionare solo con “/ dev”.

Ecco come rendere eseguibile lo script:

chmod +x fcnt2.sh

Ora provalo con alcune directory. Puoi fare prima “/ dev” per assicurarti di ottenere lo stesso risultato di prima. Digita quanto segue:

./fnct2.sh /dev
./fnct2.sh /etc
./fnct2.sh /bin

Si ottiene lo stesso risultato (207 file) di prima per la directory “/ dev”. Ciò è incoraggiante e si ottengono risultati specifici della directory per ciascuno degli altri parametri della riga di comando.

Per abbreviare lo script, puoi fare a meno della variabile, folder_to_count, del tutto, e fare semplicemente riferimento a $ 1 in tutto, come segue:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Lavorare con variabili speciali

Abbiamo menzionato $ 0, che è sempre impostato sul nome del file dello script. Questo ti permette di usare lo script per fare cose come stampare il suo nome correttamente, anche se è stato rinominato. Ciò è utile nelle situazioni di registrazione, in cui si desidera conoscere il nome del processo che ha aggiunto una voce.

Le seguenti sono le altre variabili preimpostate speciali:

$ #: Quanti parametri della riga di comando sono stati passati allo script.
$ @: Tutti i parametri della riga di comando passati allo script.
$ ?: lo stato di uscita dell’ultimo processo da eseguire.
$$: l’ID processo (PID) dello script corrente.
$ USER: il nome utente dell’utente che esegue lo script.
$ HOSTNAME: il nome host del computer che esegue lo script.
$ SECONDS: il numero di secondi per cui lo script è stato eseguito.
$ RANDOM: restituisce un numero casuale.
$ LINENO: restituisce il numero di riga corrente dello script.

Vuoi vederli tutti in un copione, vero? Puoi! Salva quanto segue come file di testo chiamato special.sh:

#!/bin/bash

echo "There were $# command line parameters"
echo "They are: $@"
echo "Parameter 1 is: $1"
echo "The script is called: $0"
# any old process so that we can report on the exit status
pwd
echo "pwd returned $?"
echo "This script has Process ID $$"
echo "The script was started by $USER"
echo "It is running on $HOSTNAME"
sleep 3
echo "It has been running for $SECONDS seconds"
echo "Random number: $RANDOM"
echo "This is line number $LINENO of the script"

Digita quanto segue per renderlo eseguibile:

chmod +x special.sh

Ora puoi eseguirlo con una serie di diversi parametri della riga di comando, come mostrato di seguito.

variabili ambientali

Bash utilizza le variabili d’ambiente per definire e registrare le proprietà dell’ambiente che crea all’avvio. Queste informazioni di conservazione possono essere facilmente accessibili a Bash, come il nome utente, le impostazioni internazionali, il numero di comandi che il file della cronologia può contenere, l’editor predefinito e molto altro ancora.

Per vedere le variabili d’ambiente attive nella tua sessione Bash, usa questo comando:

env | less

Il

Se scorri l’elenco, potresti trovare alcuni a cui sarebbe utile fare riferimento nei tuoi script.

Un elenco di variabili di ambiente attive in una finestra di terminale.

Come esportare le variabili

Quando uno script viene eseguito, è nel proprio processo e le variabili che utilizza non possono essere visualizzate al di fuori di tale processo. Se desideri condividere una variabile con un altro script avviato dal tuo script, devi esportare quella variabile. Ti mostreremo come farlo con due script.

Innanzitutto, salva quanto segue con il nome file script_one.sh:

#!/bin/bash

first_var=alpha
second_var=bravo

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

export first_var
export second_var

./script_two.sh

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Questo crea due variabili, first_var e second_var, e assegna alcuni valori. Li stampa nella finestra del terminale, esporta le variabili e chiama script_two.sh. Quando script_two.sh termina e il flusso del processo ritorna a questo script, stampa nuovamente le variabili nella finestra del terminale. Quindi, puoi vedere se sono cambiati.

Il secondo script che useremo è script_two.sh. Questo è lo script che script_one.shcalls. Digita quanto segue:

#!/bin/bash

# check their values
echo "$0: first_var=$first_var, second_var=$second_var"

# set new values
first_var=charlie
second_var=delta

# check their values again
echo "$0: first_var=$first_var, second_var=$second_var"

Questo secondo script stampa i valori delle due variabili, assegna loro nuovi valori e poi li stampa di nuovo.

Per eseguire questi script, è necessario digitare quanto segue per renderli eseguibili:

chmod +x script_one.sh
chmod +x script_two.sh

E ora, digita quanto segue per avviare script_one.sh:

./script_one.sh

Questo è ciò che ci dice l’output:

script_one.sh stampa i valori delle variabili, che sono alpha e bravo.
script_two.sh stampa i valori delle variabili (alpha e bravo) così come li ha ricevuti.
script_two.sh li cambia in charlie e delta.
script_one.sh stampa i valori delle variabili, che sono ancora alpha e bravo.

Ciò che accade nel secondo script, rimane nel secondo script. È come se le copie delle variabili vengano inviate al secondo script, ma vengono scartate quando lo script viene chiuso. Le variabili originali nel primo script non vengono alterate da nulla che accade alle loro copie nel secondo.

Come citare le variabili

Potresti aver notato che quando gli script fanno riferimento a variabili, sono tra virgolette “. Ciò consente di fare riferimento correttamente alle variabili, quindi i loro valori vengono utilizzati quando la riga viene eseguita nello script.

Se il valore che assegni a una variabile include spazi, devono essere tra virgolette quando li assegni alla variabile. Questo perché, per impostazione predefinita, Bash utilizza uno spazio come delimitatore.

Ecco un esempio:

site_name=winadmin.it

Bash vede lo spazio prima di “Geek” come un’indicazione che sta iniziando un nuovo comando. Segnala che non esiste un tale comando e abbandona la riga. echo ci mostra che la variabile site_name non contiene nulla, nemmeno il testo “How-To”.

Riprova tra virgolette attorno al valore, come mostrato di seguito:

site_name="winadmin.it"

nome_sito =

Questa volta, viene riconosciuto come un singolo valore e assegnato correttamente alla variabile site_name.

echo è tuo amico

Può volerci un po ‘di tempo per abituarsi alla sostituzione dei comandi, citando le variabili e ricordandosi quando includere il segno del dollaro.

Prima di premere Invio ed eseguire una riga di comandi Bash, provalo con l’eco davanti. In questo modo, puoi assicurarti che ciò che accadrà sia ciò che desideri. Puoi anche rilevare eventuali errori che potresti aver commesso nella sintassi.