Come lavorare con le variabili in Bash

Un terminale Linux con testo verde su un laptop.
Fatmawati Achmad Zaenuri / Shutterstock

Le variabili sono fondamentali se vuoi scrivere script e capire cosa farà quel codice che intendi tagliare e incollare dal Web sul tuo computer Linux. Ti iniziare!

Variabili 101

Le variabili sono denominate simboli che rappresentano una stringa o un valore numerico. Quando li usi in comandi ed espressioni, vengono trattati come se tu avessi digitato il valore che detengono invece del nome della variabile.

Per creare una variabile, basta fornire un nome e un valore per essa. I nomi delle variabili devono essere descrittivi e ricordare il valore che contengono. Un nome di variabile non può iniziare con un numero, né può contenere spazi. Tuttavia, può iniziare con un carattere di sottolineatura. Oltre a ciò, è possibile utilizzare qualsiasi combinazione di caratteri alfanumerici maiuscoli e minuscoli.

Esempi

Qui creeremo cinque variabili. Il formato è digitare il nome, il segno di uguale =e il valore. Nota che non esiste uno spazio prima o dopo il segno di uguale. Dare un valore a una variabile viene spesso definito come assegnazione un valore per la 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 terminale.

Per vedere il valore contenuto in una variabile, utilizzare il echo comando. Devi precedere il nome della variabile con un simbolo di dollaro $ ogni volta che fai riferimento al valore che contiene, come mostrato di seguito:

echo $my_name
echo $my_boost
echo $this_year

Il comando "echo" che mostra i valori delle variabili in una finestra terminale.

Usiamo tutte le nostre variabili contemporaneamente:

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

"Echo" $ my_boost è $ me come $ his_boost è $ him (c) $ this_year "in una finestra terminale.

I valori delle variabili sostituiscono i loro nomi. Puoi anche cambiare i valori delle variabili. Per assegnare un nuovo valore alla variabile, my_boost, ripeti semplicemente ciò che hai fatto quando hai assegnato il suo primo valore, in questo modo:

my_boost=Tequila

La variabile "my_boost = Tequila" in una finestra terminale.

Se si esegue nuovamente il comando precedente, si ottiene ora un risultato diverso:

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

L'eco "$ my_boost è a $ me come $ his_boost è al comando $ him (c) $ this_year" in una finestra del terminale.

Pertanto, è possibile utilizzare lo stesso comando che fa riferimento alle stesse variabili e ottenere risultati diversi se si modificano i valori conservati nelle variabili.

Parleremo di citare le variabili in seguito. Per ora, ecco alcune cose da ricordare:

  • Una variabile tra virgolette singole ' viene trattato come una stringa letterale e non come una variabile.
  • Variabili tra virgolette " sono trattati come variabili.
  • Per ottenere il valore trattenuto 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 riferimenti a variabili in una finestra terminale.

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

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

Il comando drink_of-the_Year = "$ my_boost $ this_year" in una finestra del terminale.

Come utilizzare le variabili negli script

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

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, è necessario renderlo eseguibile, come mostrato di seguito:

chmod +x fcnt.sh

"chmod + x fcnt.sh" in una finestra del terminale.

Digitare quanto segue per eseguire lo script:

./fcnt.sh

"./fcnt.sh" in una finestra del terminale.

Questo stampa il numero di file nel file /dev directory. Ecco come funziona:

  • Una variabile chiamata folder_to_count è definito ed è impostato per contenere la stringa “/ dev”.
  • Un'altra variabile, chiamata file_count, è definito. Questa variabile prende il suo valore dalla sostituzione di un comando. Questa è la frase di comando tra 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 è assegnato a file_count variabile. Per quanto riguarda il file_count la variabile è interessata, ha superato un valore da conservare; non si preoccupa di come è stato ottenuto il valore.
  • Il comando valutato nella sostituzione comando esegue un ls elenco dei file nella directory in folder_to_count variabile, che è stata impostata su “/ dev”. Quindi, lo script esegue il comando “ls / dev”.
  • L'output di questo comando viene reindirizzato nel file wc comando. Il -l (conteggio righe) cause dell'opzione wc per contare il numero di righe nell'output dal file ls comando. Poiché ogni file è elencato su una riga separata, questo è il conteggio di file e sottodirectory nella directory “/ dev”. Questo valore è assegnato a file_count variabile.
  • 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, accetta i parametri della riga di comando. Questi forniscono informazioni al comando, quindi sa cosa vuoi che faccia. Se vuoi ls per lavorare sulla tua home directory e anche per mostrare i file nascosti, puoi usare il seguente comando, dove la tilde ~ e il -a (tutte) le opzioni sono i parametri della riga di comando:

ls ~ -a

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

Puoi fare riferimento ai parametri della riga di comando in uno script come faresti con le normali variabili. 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, il folder_to_count alla variabile 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 è hardcoded per funzionare solo con “/ dev”.

Ecco come rendere eseguibile lo script:

chmod +x fcnt2.sh

"chmod + x fcnt2.sh" in una finestra del terminale.

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

"./fnct2.sh / dev" in una finestra terminale.

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, è possibile rinunciare alla variabile, folder_to_count, nel complesso, e solo riferimento $1 dappertutto, come segue:

#!/bin/bash 

file_count=$(ls $1  wc -l) 

echo $file_count files in $1

Lavorare con variabili speciali

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

Di seguito sono riportate le altre variabili predefinite 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.
  • $ SECONDI: Il numero di secondi per cui lo script è in esecuzione.
  • $ RANDOM: Restituisce un numero casuale.
  • $ LINENO: Restituisce il numero di riga corrente dello script.

Vuoi vederli tutti in una sceneggiatura, vero? Puoi! Salvare 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"

Digitare quanto segue per renderlo eseguibile:

chmod +x special.sh

"chmod + x special.sh" in una finestra del terminale.

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

"./special.sh alpha bravo charlie 56 2048 Thursday" in una finestra terminale.

variabili ambientali

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

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

env | less

Il comando "env | less" in una finestra del terminale

Se scorri l'elenco, potresti trovarne alcuni che potrebbero essere utili come riferimento nei tuoi script.

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

Come esportare variabili

Quando viene eseguito uno script, si trova nel suo stesso processo e le variabili che utilizza non possono essere visualizzate al di fuori di tale processo. Se si desidera condividere una variabile con un altro script avviato dallo script, è necessario esportare quella variabile. Ti mostreremo come farlo con due script.

Innanzitutto, salvare 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_vare assegna alcuni valori. Li stampa sulla finestra del terminale, esporta le variabili e chiama script_two.sh. quando script_two.sh termina e il flusso di 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. Questa è la sceneggiatura che script_one.shchiamate. 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 quindi 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

"chmod + x script_one.sh" e "chmod + x script_two.sh" in una finestra del terminale.

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

./script_one.sh

"./script_one.sh" in una finestra del terminale.

Questo è ciò che ci dice l'output:

  • script_one.sh stampa i valori delle variabili, che sono alfa e bravo.
  • script_two.sh stampa i valori delle variabili (alfa 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 alfa e bravo.

Quello che succede nel secondo script, rimane nel secondo script. È come se le copie delle variabili vengano inviate al secondo script, ma vengono eliminate quando lo script viene chiuso. Le variabili originali nel primo script non sono modificate da qualsiasi cosa accada alle loro copie nel secondo.

Come citare le variabili

Avrai 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 assegnato a una variabile include spazi, devono essere racchiusi tra virgolette quando vengono assegnati alla variabile. Questo perché, per impostazione predefinita, Bash utilizza uno spazio come delimitatore.

Ecco un esempio:

site_name=How-To Geek

"site_name = How-To Geek" in una finestra terminale.

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

Riprova con le virgolette attorno al valore, come mostrato di seguito:

site_name="How-To Geek"

site_name = "How-To Geek" in una finestra terminale.

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

echo è tuo amico

Può richiedere del tempo per abituarsi a comandare la sostituzione, citando le variabili e ricordando quando includere il simbolo del dollaro.

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

Articoli correlati

Ultimi articoli