Oggi parleremo di bash-script. Questo è , scritti per la shell bash. Ci sono anche altre shell, come zsh, tcsh, ksh, ma ci concentreremo su bash. Questo materiale è rivolto a tutti gli interessati, l'unico requisito è saper lavorare con la Linux.
Gli script della riga di comando sono set di comandi che possono essere digitati dalla tastiera, raccolti in file e uniti con un obiettivo comune. I risultati dell'esecuzione dei comandi possono avere valore autonomo o servire come input per altri comandi. Gli script sono un modo potente per automatizzare azioni ripetitive.
Quindi, parlando della riga di comando, essa consente di eseguire più comandi in una sola volta, inserendoli attraverso il punto e virgola:
pwd ; whoami In effetti, se hai provato questo nel tuo terminale, il tuo primo bash-script, che utilizza due comandi, è già stato scritto. Funziona così. Prima il comando pwd mostra a schermo informazioni sulla directory di lavoro corrente, poi il comando whoamimostra i dati sull'utente con cui sei connesso al sistema.
Utilizzando questo approccio, puoi combinare quanti più comandi vuoi in una sola riga, l'unico limite è il numero massimo di argomenti che possono essere passati al programma. Questo limite può essere determinato con il seguente comando:
getconf ARG_MAXLa riga di comando è uno strumento eccellente, ma i comandi devono essere digitati ogni volta che ne hai bisogno. Cosa succederebbe se registrassi un insieme di comandi in un file e semplicemente richiamassi quel file per eseguirli? Quel file di cui parliamo è chiamato script della riga di comando.
Come sono strutturati i bash-script
Crea un file vuoto usando il comando touch. Nella sua prima riga, è necessario specificare quale shell intendiamo utilizzare. Ci interessa bash, quindi la prima riga del file sarà la seguente:
#!/bin/bash Nelle altre righe di questo file, il simbolo del cancelletto viene utilizzato per indicare commenti che la shell non elabora. Tuttavia, la prima riga è un caso particolare, qui il cancelletto seguito da un punto esclamativo (questa sequenza è chiamata ) e il percorso a bash, indicano al sistema che lo script è stato creato specificamente per bash.
I comandi della shell sono separati da un ritorno a capo, i commenti sono evidenziati dal simbolo del cancelletto. Ecco come appare:
#!/bin/bash
# This is a comment
pwd
whoamiQui, proprio come nella riga di comando, è possibile scrivere comandi su una sola riga, separandoli con un punto e virgola. Tuttavia, se si scrivono comandi su righe diverse, il file sarà più leggibile. In ogni caso, la shell li elaborerà.
Impostazione delle autorizzazioni per il file dello script
Salva il file con il nome myscript, e il lavoro per creare lo script bash è quasi completato. Ora resta solo da rendere questo file eseguibile, altrimenti, tentando di eseguirlo, si verificherà un errore Permission denied.

Tentativo di eseguire un file di script con autorizzazioni non configurate correttamente
Rendiamo il file eseguibile:
chmod +x ./myscriptOra proviamo ad eseguirlo:
./myscriptDopo aver impostato le autorizzazioni, tutto funziona come previsto.

Esecuzione riuscita dello script bash
Output dei messaggi
Per stampare testo nella console di Linux, si utilizza il comando echo. Sfruttiamo questa conoscenza e modifichiamo il nostro script, aggiungendo spiegazioni ai dati che le comandi già presenti stampano:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoamiEcco cosa otterremo dopo aver eseguito lo script aggiornato.

Output dei messaggi dallo script
Ora possiamo stampare etichette esplicative, utilizzando il comando echo. Se non sai come modificare un file usando gli strumenti di Linux, o non hai mai incontrato il comando echo, dai un'occhiata al materiale.
Utilizzo delle variabili
Le variabili consentono di memorizzare informazioni nel file dello script, ad esempio - i risultati delle comandi per essere utilizzati da altri comandi.
Non c'è niente di sbagliato nell'eseguire singole comandi senza memorizzare i risultati del loro funzionamento, ma le possibilità di tale approccio sono piuttosto limitate.
Esistono due tipi di variabili che possono essere utilizzate negli script bash:
- Variabili ambiente
- Variabili personalizzate
Variabili ambiente
A volte nei team della shell è necessario lavorare con alcuni dati di sistema. Ecco, ad esempio, come visualizzare la home directory dell'utente corrente:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Fai attenzione al fatto che possiamo usare la variabile di sistema $HOME tra virgolette, questo non impedirà al sistema di riconoscerla. Ecco cosa accadrà se eseguiamo lo script di cui sopra.

Uso della variabile di ambiente nello script
E se vogliamo visualizzare il simbolo del dollaro? Proviamo in questo modo:
echo "I have $1 in my pocket" Il sistema riconoscerà il simbolo del dollaro nella stringa racchiusa tra virgolette e deciderà che ci stiamo riferendo a una variabile. Lo script cercherà di visualizzare il valore di una variabile non definita $1. Questo non è ciò di cui abbiamo bisogno. Cosa fare?
In una situazione simile, aiuta utilizzare un carattere di escape, una barra rovesciata, davanti al simbolo del dollaro:
echo "I have $1 in my pocket"Ora lo script visualizzerà esattamente ciò che ci aspettiamo.

Uso della sequenza di escape per visualizzare il simbolo del dollaro
Variabili personalizzate
Oltre alle variabili di ambiente, gli script bash consentono di definire e utilizzare le proprie variabili nello script. Queste variabili memorizzano il valore fino al termine dell'esecuzione dello script.
Come nel caso delle variabili di sistema, possiamo accedere alle variabili utente utilizzando il simbolo del dollaro:
TNW-CUS-FMP è il codice promozionale per uno sconto del 10% sui nostri servizi, disponibile per l'attivazione per 7 giorni
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Ecco cosa accadrà dopo l'esecuzione di tale script.

Variabili utente nello script
Sostituzione dei comandi
Una delle funzionalità più utili degli script bash è la possibilità di estrarre informazioni dall'uscita dei comandi e assegnarle a variabili, il che consente di utilizzare queste informazioni ovunque nel file dello script.
Questo può essere fatto in due modi.
- Utilizzando il carattere di backtick «`»
- Utilizzando la sintassi
$()
Con il primo approccio, assicurati di non confondere il backtick con un apostrofo. Il comando deve essere racchiuso in due di questi caratteri:
mydir=`pwd`Con il secondo approccio, si scrive allo stesso modo:
mydir=$(pwd)E alla fine, lo script potrebbe apparire così:
#!/bin/bash
mydir=$(pwd)
echo $mydir Durante la sua esecuzione, l'uscita del comando pwdverrà salvata nella variabile mydir, il cui contenuto, tramite il comando echo, apparirà nella console.

Uno script che salva i risultati dell'esecuzione del comando in una variabile
Operazioni matematiche
Per eseguire operazioni matematiche in un file script, è possibile utilizzare una costruzione del tipo $((a+b)):
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2 
Operazioni matematiche nello script
Costrutto di controllo if-then
In alcuni script è necessario controllare il flusso di esecuzione dei comandi. Ad esempio, se un certo valore è maggiore di cinque, bisogna eseguire un'azione, altrimenti un'altra. Questa logica si applica a molte situazioni, e qui ci aiuterà il costrutto di controllo if-then. Nella sua forma più semplice appare così:
if comando
then
comandi
fiEcco un esempio pratico:
#!/bin/bash
if pwd
then
echo "It works"
fi In questo caso, se l'esecuzione del comando pwdha successo, verrà stampato in console il testo «it works».
Utilizziamo le conoscenze che abbiamo e scriviamo uno script più complesso. Diciamo, dobbiamo trovare un certo utente in /etc/passwd, e se siamo riusciti a trovarlo, comunicargli che esiste.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiEcco cosa otteniamo dopo aver eseguito questo script.

Ricerca utente
Qui abbiamo utilizzato il comando grepper cercare un utente nel file /etc/passwd. Se il comando grepnon ti è familiare, puoi trovare la sua descrizione .
In questo esempio, se l'utente viene trovato, lo script stamperà il messaggio corrispondente. E se non siamo riusciti a trovare l'utente? In tal caso, lo script terminerà semplicemente l'esecuzione senza dirci nulla. Vorremmo che ci informasse anche di questo, quindi miglioreremo il codice.
Costrutto di controllo if-then-else
Affinché il programma possa comunicarci sia i risultati della ricerca riuscita che quelli della sfortunata, utilizzeremo la costruzione if-then-else. Ecco come è strutturata:
if comando
then
comandi
else
comandi
fi Se il primo comando restituisce zero, il che significa che è stato eseguito con successo, la condizione risulterà vera e l'esecuzione non seguirà il ramo else. Altrimenti, se verrà restituito qualcosa di diverso da zero, che indicherà un fallimento o un risultato falso, verranno eseguiti i comandi posti dopo else.
Scriviamo uno script di questo tipo:
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi La sua esecuzione è andata per il ramo else.

Esecuzione dello script con la costruzione if-then-else
Bene, continuiamo a muoverci avanti e poniamoci la questione di condizioni più complesse. Cosa succede se dobbiamo verificare più di una condizione? Ad esempio, se l'utente desiderato è stato trovato, dobbiamo stampare un messaggio, se un'altra condizione è soddisfatta — un altro messaggio, e così via. In una situazione simile ci aiuteranno le condizioni annidate. Si presenta così:
if comando1
then
comandi
elif comando2
then
comandi
fi Se il primo comando restituisce zero, il che indica il suo successo, verranno eseguiti i comandi nel primo blocco. allora, altrimenti, se la prima condizione risulta falsa e se il secondo comando restituisce zero, verrà eseguito il secondo blocco di codice.
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd
then
echo "The user $user Exists"
elif ls /home
then
echo "The user doesn’t exist but anyway there is a directory under /home"
fi In uno script simile, ad esempio, si può creare un nuovo utente con il comando useradd, se la ricerca non ha prodotto risultati, o fare qualcos'altro di utile.
Confronto dei numeri
Negli script è possibile confrontare valori numerici. Ecco un elenco dei comandi corrispondenti.
n1 -eq n2Restituisce un valore vero sen1è uguale an2.
n1 -ge n2Restituisce un valore vero sen1maggiore o uguale an2.
n1 -gt n2Restituisce un valore vero sen1maggioren2.
n1 -le n2Restituisce un valore vero sen1minore o uguale an2.
n1 -lt n2Restituisce un valore vero se n1 è minore din2.
n1 -ne n2Restituisce un valore vero sen1non è uguale an2.
Come esempio, proviamo uno degli operatori di confronto. Nota che l'espressione è racchiusa tra parentesi quadre.
#!/bin/bash
val1=6
if [ $val1 -gt 5 ]
then
echo "The test value $val1 is greater than 5"
else
echo "The test value $val1 is not greater than 5"
fiEcco cosa stamperà questo comando.

Confronto dei numeri negli script
Il valore della variabile val1è maggiore di 5, di conseguenza si esegue il ramo alloradell'operatore di confronto e viene stampato il messaggio corrispondente in console.
Confronto delle stringhe
Negli script è possibile confrontare anche i valori delle stringhe. Gli operatori di confronto sono piuttosto semplici, tuttavia ci sono peculiarità nelle operazioni di confronto delle stringhe che tratteremo di seguito. Ecco l'elenco degli operatori.
str1 = str2Controlla se le stringhe sono uguali, restituisce vero se le stringhe sono identiche.
str1 != str2Restituisce vero se le stringhe non sono identiche.
str1 < str2Restituisce vero sestr1è minore distr2.
str1 > str2Restituisce vero sestr1è maggiore distr2.
-n str1Restituisce vero se la lunghezzastr1è maggiore di zero.
-z str1Restituisce vero se la lunghezzastr1è uguale a zero.
Ecco un esempio di confronto delle stringhe in uno script:
#!/bin/bash
user ="likegeeks"
if [$user = $USER]
then
echo "The user $user is the current logged in user"
fiDi conseguenza, l'esecuzione dello script restituirà quanto segue.

Confronto delle stringhe negli script
Una caratteristica del confronto delle stringhe merita di essere menzionata. In particolare, gli operatori «>» e «» come un comando di reindirizzamento dell'output.
Ecco come appare il lavoro con questi operatori nel codice:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiEcco i risultati dell'esecuzione dello script.

Confronto delle stringhe, avviso emesso
Si prega di notare che lo script, sebbene venga eseguito, genera un avviso:
.\/myscript: riga 5: [: troppi argomenti Per eliminare questo avviso, racchiudiamo $val2 tra virgolette:
#!/bin/bash
val1=text
val2="another text"
if [ $val1 > "$val2" ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiOra tutto funziona come deve.

Confronto delle stringhe
Un'altra caratteristica degli operatori «>» e «<» è come funzionano con i caratteri maiuscoli e minuscoli. Per comprendere questa caratteristica, prepariamo un file di testo con il seguente contenuto:
Likegeeks
likegeeks Salviamolo con il nome myfile, dopodiché eseguiremo il seguente comando nel terminale:
sort myfileQuesto ordinerà le righe del file in questo modo:
likegeeks
Likegeeks Team sort, per impostazione predefinita, ordina le righe in ordine crescente, il che significa che la lettera minuscola nel nostro esempio è inferiore a quella maiuscola. Ora prepariamo uno script che confronterà le stesse stringhe:
#!/bin/bash
val1=Likegeeks
val2=likegeeks
if [ $val1 > $val2 ]
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fiSe lo eseguiamo, constateremo che è esattamente il contrario: la lettera minuscola è ora maggiore di quella maiuscola.

Il comando sort e il confronto delle stringhe nel file di script
Nei comandi di confronto, le lettere maiuscole sono considerate inferiori a quelle minuscole. Il confronto delle stringhe qui viene eseguito confrontando i codici ASCII dei caratteri, quindi l'ordine di ordinamento dipende dai codici dei caratteri.
Team sort, a sua volta, utilizza l'ordine di ordinamento definito nelle impostazioni della lingua di sistema.
Controlli sui file
Probabilmente, i seguenti comandi vengono utilizzati più frequentemente negli script bash. Permettono di verificare diverse condizioni relative ai file. Ecco un elenco di questi comandi.
-d fileControlla se il file esiste ed è una directory.
-e fileControlla se il file esiste.
-f fileControlla se il file esiste ed è un file regolare.
-r fileControlla se il file esiste ed è accessibile in lettura.
-s file Pcontrolla se il file esiste e non è vuoto.
-w fileControlla se il file esiste ed è accessibile in scrittura.
-x fileControlla se il file esiste ed è eseguibile.
file1 -nt file2Controlla se è più recente difile1, rispetto afile2.
file1 -ot file2Controlla se è più vecchio difile1, rispetto afile2.
-O fileControlla se il file esiste e se l'utente attuale è il suo proprietario.
-G fileControlla se il file esiste e se il suo identificativo di gruppo corrisponde all'identificativo di gruppo dell'utente attuale.
Questi comandi, come del resto molti altri trattati oggi, non sono difficili da memorizzare. I loro nomi, essendo abbreviazioni di varie parole, indicano chiaramente i controlli che eseguono.
Proviamo uno dei comandi nella pratica:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]
then
echo "The $mydir directory exists"
cd $ mydir
ls
else
echo "The $mydir directory does not exist"
fiQuesto script, per una directory esistente, stamperà il suo contenuto.

Stampa del contenuto della directory
Supponiamo che con gli altri comandi tu possa sperimentare autonomamente, tutti sono applicati secondo lo stesso principio.
Conclusioni
Oggi abbiamo parlato di come iniziare a scrivere script bash e abbiamo esaminato alcune basi. In realtà, il tema della programmazione bash è vasto. Questo articolo è una traduzione della prima parte di una grande serie di 11 materiali. Se desideri subito il seguito - ecco l'elenco degli originali di questi materiali. Per comodità, è incluso anche quello di cui hai appena letto la traduzione.
- — qui si tratta di come iniziare a creare script bash, si esamina l'uso delle variabili, si descrivono le strutture condizionali, le operazioni, i confronti tra numeri, stringhe, l'acquisizione di informazioni sui file.
- — qui si esplorano le caratteristiche del lavoro con i cicli for e while.
- — questo materiale è dedicato ai parametri della riga di comando e alle chiavi che possono essere passate agli script, al lavoro con i dati inseriti dall'utente e che possono essere letti da file.
- — qui si parla dei descrittori di file e del loro utilizzo, dei flussi di input, output, errori, e delle ridirezioni.
- — questo materiale è dedicato ai segnali Linux, alla loro gestione negli script, e all'esecuzione di scenari programmati.
- — qui puoi scoprire come creare e utilizzare funzioni negli script, e sviluppare librerie.
- — questo articolo è dedicato al lavoro con l'editor di testo in streaming sed.
- — questo materiale è dedicato alla programmazione nel linguaggio di elaborazione dati awk.
- — qui puoi leggere sull'uso delle espressioni regolari negli script bash.
- — qui sono riportati i metodi per lavorare con i messaggi che possono essere inviati agli utenti, nonché la metodologia di monitoraggio del disco.
- — questo materiale è dedicato allo strumento Expect, che consente di automatizzare l'interazione con utilità interattive. In particolare, qui si parla degli script expect e della loro interazione con script bash e altri programmi.
Riteniamo che una delle preziose caratteristiche di questa serie di articoli sia che, partendo dal più semplice, adatto a utenti di qualsiasi livello, conduce gradualmente a temi piuttosto impegnativi, dando a tutti i partecipanti la possibilità di progredire nella creazione di script per la riga di comando di Linux.
Gentili lettori! Chiediamo ai guru della programmazione bash di raccontare come hanno raggiunto le vette della loro maestria, di condividere segreti, mentre aspettiamo le impressioni di coloro che hanno appena scritto il loro primo script.
Solo gli utenti registrati possono partecipare al sondaggio. , per favore.
Tradurre le altre parti del ciclo di articoli?
Sì!
No, non è necessario
Hanno votato 1030 utenti. 106 utenti si sono astenuti.
Fonte: habr.com
