Oggi parleremo di bash scripting. Questo è , scritto per la shell bash. Esistono altre shell, come zsh, tcsh, ksh, ma ci concentreremo su bash. Questo materiale è destinato a chiunque sia interessato; l'unico requisito è la capacità di lavorare nella di Linux.
Gli script da riga di comando sono set di comandi identici che possono essere inseriti da tastiera, raggruppati in file e uniti da un obiettivo comune. I risultati dell'esecuzione dei comandi possono avere un valore autonomo o servire come input per altri comandi. Gli script rappresentano un modo potente per automatizzare azioni frequentemente ripetute.
Quindi, parlando della riga di comando, permette di eseguire più comandi contemporaneamente inserendoli tramite un punto e virgola:
pwd ; whoami In effetti, se hai provato questo nel tuo terminale, il tuo primo script bash, che utilizza due comandi, è già scritto. Funziona così: prima il comando pwd mostra sullo schermo informazioni sulla directory di lavoro corrente, poi il comando whoamimostra dati sull'utente con cui hai effettuato l'accesso al sistema.
Utilizzando questo approccio, puoi combinare un numero illimitato di comandi 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 le comandi devono essere digitati ogni volta che è necessario. E se registrassimo un insieme di comandi in un file e lo richiamassimo per eseguirli? In effetti, il file di cui stiamo parlando si chiama script della riga di comando.
Come sono strutturati gli script bash
Crea un file vuoto utilizzando 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 speciale, 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 interruzione di riga, mentre i commenti sono contrassegnati dal simbolo del cancelletto. Ecco come appare:
#!/bin/bash
# This is a comment
pwd
whoamiQui, proprio come nella riga di comando, puoi scrivere comandi su una sola riga, separandoli con un punto e virgola. Tuttavia, se scrivi comandi su righe diverse, il file risulta più leggibile. In ogni caso, la shell li elaborerà.
Impostazione dei permessi per il file dello script
Salva il file, assegnandogli un nome myscript, e il lavoro di creazione dello script bash è quasi terminato. Ora resta solo da rendere questo file eseguibile; altrimenti, cercando di eseguirlo, ti imbatterai in un errore Permission denied.

Tentativo di eseguire il file dello script con permessi configurati in modo errato
Rendiamo il file eseguibile:
chmod +x ./myscriptOra proviamo a eseguirlo:
./myscriptDopo aver impostato i permessi, tutto funziona come si deve.

Esecuzione riuscita dello script bash
Output dei messaggi
Per stampare testo sulla console Linux si utilizza il comando echo. Sfruttiamo questa conoscenza e modifichiamo il nostro script, aggiungendo chiarimenti ai dati che vengono restituiti dai comandi già presenti:
#!/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 visualizzare etichette esplicative, usando il comando echo. Se non sai come modificare un file utilizzando gli strumenti Linux, o se non hai mai utilizzato il comando echo, dai un'occhiata a questo materiale.
Utilizzo delle variabili
Le variabili consentono di memorizzare informazioni in un file di script, ad esempio—i risultati dell'esecuzione di comandi, per il loro utilizzo in altri comandi.
Non c'è nulla di sbagliato nell'eseguire comandi singoli senza memorizzare i risultati, ma le possibilità di questo approccio sono molto limitate.
Esistono due tipi di variabili che possono essere utilizzate negli script bash:
- Variabili d'ambiente
- Variabili utente
Variabili d'ambiente
A volte, nei comandi della shell, è necessario lavorare con alcuni dati di sistema. Ecco, ad esempio, come visualizzare la directory home dell'utente corrente:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME" Nota che possiamo usare la variabile di sistema $HOME tra virgolette, non impedirà al sistema di riconoscerla. Ecco cosa otterremo se eseguiamo lo script sopra.

Utilizzo di una variabile d'ambiente nello script
E se dobbiamo visualizzare il simbolo del dollaro? Proviamo così:
echo "I have $1 in my pocket" Il sistema rileverà il simbolo del dollaro in una stringa racchiusa tra virgolette e presumerà che ci stiamo riferendo a una variabile. Lo script cercherà di stampare il valore di una variabile non definita. $1. Questo non è ciò di cui abbiamo bisogno. Cosa fare?
In una situazione del genere, può essere utile utilizzare un carattere di escape, una barra inversa, prima del simbolo del dollaro:
echo "I have $1 in my pocket"Ora lo script stamperà esattamente ciò che ci aspettiamo.

Utilizzo della sequenza di escape per stampare il simbolo del dollaro
Variabili utente
Oltre alle variabili di ambiente, gli script bash consentono di definire e utilizzare le proprie variabili nello script. Queste variabili mantengono il valore fino al termine dell'esecuzione dello script.
Come nel caso delle variabili di sistema, si può accedere alle variabili personali utilizzando il simbolo del dollaro:
TNW-CUS-FMP — codice promozionale per uno sconto del 10% sui nostri servizi, attivabile entro 7 giorni.
#!/bin/bash
# testing variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"Ecco cosa otterrete dopo aver eseguito questo script.

Variabili personali nello script
Sostituzione dei comandi
Una delle funzionalità più utili degli script bash è la possibilità di estrarre informazioni dall'output dei comandi e assegnarle a variabili, permettendo di utilizzare queste informazioni ovunque nel file di script.
È possibile farlo in due modi.
- Utilizzando il simbolo di backtick «`»
- Utilizzando la sintassi
$()
Nel primo approccio, assicurati di non inserire un apostrofo semplice anziché il backtick. Il comando deve essere racchiuso in due di questi simboli:
mydir=`pwd`Nel secondo approccio, la stessa cosa si scrive così:
mydir=$(pwd)E lo script, alla fine, può apparire così:
#!/bin/bash
mydir=$(pwd)
echo $mydir Durante la sua esecuzione, l'output del comando pwdsarà salvato nella variabile mydir, il cui contenuto, mediante il comando echo, verrà mostrato nella console.

Uno script che salva i risultati dell'esecuzione di un comando in una variabile
Operazioni matematiche
Per eseguire operazioni matematiche all'interno del file di script, è possibile utilizzare una sintassi 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 alcune situazioni, è necessario controllare il flusso di esecuzione dei comandi. Per esempio, se un certo valore è maggiore di cinque, bisogna eseguire un'azione, altrimenti un'altra. Questo è applicabile in molte situazioni e qui ci aiuterà la struttura di controllo. if-then. Nella 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 pwdsi conclude con successo, verrà visualizzato nel console il testo «it works».
Utilizziamo le conoscenze che abbiamo e scriviamo uno scenario più complesso. Supponiamo di dover trovare un certo utente in /etc/passwd, e se si riesce a trovarlo, comunicare che esiste.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fiEcco cosa otteniamo dopo l'esecuzione di questo script.

Ricerca utente
Qui abbiamo usato il comando grepper cercare l'utente nel file /etc/passwd. Se il comando grepti è sconosciuto, puoi trovarne la descrizione. .
In questo esempio, se l'utente viene trovato, lo script stamperà il messaggio corrispondente. E se non riusciamo a trovare l'utente? In questo caso, lo script semplicemente terminerà senza darci alcuna informazione. Ci piacerebbe che ci informsse anche di questo, quindi miglioriamo il codice.
Struttura di controllo if-then-else
Affinché il programma possa comunicare sia i risultati di una ricerca avvenuta con successo che di un fallimento, utilizziamo la struttura if-then-else. Ecco come è strutturata:
if comando
then
comandi
else
comandi
fi Se il primo comando restituirà zero, il che significa che è stato eseguito con successo, la condizione si rivelerà vera e l'esecuzione non seguirà il ramo else. Altrimenti, se verrà restituito qualcosa di diverso da zero, il che significherà 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 struttura if-then-else
Bene, continuiamo e poniamoci la domanda su condizioni più complesse. Cosa succede se dobbiamo verificare non una condizione, ma più di una? Ad esempio, se l'utente desiderato è stato trovato, dobbiamo visualizzare un messaggio, se un'altra condizione è soddisfatta - un altro messaggio, e così via. In una situazione del genere, ci aiuteranno le condizioni annidate. Ecco come appare:
if comando1
then
comandi
elif comando2
then
comandi
fi Se il primo comando restituirà zero, il che indica che è stato eseguito con successo, verranno eseguite le istruzioni nel primo blocco. then, 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 del genere, ad esempio, è possibile creare un nuovo utente utilizzando 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. Di seguito è riportato un elenco dei comandi corrispondenti.
n1 -eq n2Restituisce un valore vero sen1è uguale an2.
n1 -ge n2Restituisce un valore vero sen1maggiore o ugualen2.
n1 -gt n2Restituisce un valore vero sen1maggioren2.
n1 -le n2Restituisce un valore vero sen1minore o ugualen2.
n1 -lt n2Restituisce un valore vero se n1 è minore din2.
n1 -ne n2Restituisce un valore vero sen1non uguale an2.
Come esempio, proveremo uno degli operatori di confronto. Fai attenzione al fatto 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 restituirà questo comando.

Confronto dei numeri negli script
Valore della variabile val1è maggiore di 5, quindi viene eseguita la ramificazione thendell'operatore di confronto e viene visualizzato il messaggio corrispondente nella console.
Confronto delle stringhe
Negli script è possibile confrontare anche i valori stringa. Gli operatori di confronto sembrano abbastanza semplici, tuttavia le operazioni di confronto delle stringhe presentano alcune peculiarità, che tratteremo di seguito. Ecco un elenco degli operatori.
str1 = str2Controlla se le stringhe sono uguali, restituisce vero se le stringhe sono identiche.
sstr1 != 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 di cui vale la pena parlare nella comparazione delle stringhe è che gli operatori ">" e "" come un comando di reindirizzamento dell'output.
Ecco come lavorare 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.

Comparazione delle stringhe, avviso generato
Si noti che lo script, pur eseguendosi, genera un avviso:
./myscript: line 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 funziona tutto come dovrebbe.

Confronto delle stringhe
Un'altra caratteristica degli operatori ">" e "<" riguarda il loro funzionamento con lettere maiuscole e minuscole. Per comprendere questa caratteristica, prepariamo un file di testo con il seguente contenuto:
Likegeeks
likegeeks Salviamo il file con il nome myfile, dopo di che eseguiremo il seguente comando nel terminale:
sort myfileEsso ordinerà le stringhe dal file in questo modo:
likegeeks
Likegeeks Team sort, di default, ordina le righe in ordine crescente, cioè la lettera minuscola nel nostro esempio è considerata minore della maiuscola. Adesso prepariamo uno script che confronterà le stesse righe:
#!/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, scopriremo che è tutto il contrario: la lettera minuscola ora è considerata maggiore della maiuscola.

Il comando sort e il confronto delle righe nel file script
Nei comandi di confronto, le lettere maiuscole sono considerate minori delle minuscole. Il confronto delle righe avviene 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 specificato nelle impostazioni della lingua di sistema.
Controlli dei file
Probabilmente, i seguenti comandi sono i più comunemente usati negli script bash. Permettono di controllare varie 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.
-r fileControlla se il file esiste ed è leggibile.
-s fileControlla se il file esiste e non è vuoto.
-w fileControlla se il file esiste ed è scrivibile.
-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 ed è di proprietà dell'utente corrente.
-G fileControlla se il file esiste e se il suo ID di gruppo corrisponde a quello dell'utente corrente.
Questi comandi, come molti altri trattati oggi, sono facili da memorizzare. I loro nomi, essendo abbreviazioni di varie parole, indicano direttamente i controlli che eseguono.
Proviamo uno dei comandi in 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, mostrerà il suo contenuto.

Output del contenuto della directory
Supponiamo che tu possa sperimentare con gli altri comandi da solo, tutti seguono lo stesso principio.
Risultati
Oggi abbiamo parlato di come iniziare a scrivere script bash e abbiamo esaminato alcune nozioni di base. In realtà, il tema della programmazione bash è vasto. Questo articolo è una traduzione della prima parte di una grande serie di 11 materiali. Se desideri il seguito subito — ecco l'elenco originale di questi materiali. Per comodità, qui è incluso anche quello che hai appena letto.
- — qui si tratta di come iniziare a creare script bash, l'uso delle variabili è stato esaminato, le strutture condizionali, i calcoli, il confronto di numeri e stringhe, e l'estrazione di informazioni sui file.
- — qui si rivelano 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 forniti dall'utente e che possono essere letti dai file.
- — qui si parla dei descrittori di file e del loro utilizzo, dei flussi di input, output, errori e di come reindirizzare l'output.
- — questo materiale è dedicato ai segnali di Linux, alla loro elaborazione negli script e all'avvio di script pianificati.
- — 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 tratta della programmazione nel linguaggio di elaborazione dati awk.
- — qui puoi leggere sull'uso delle espressioni regolari negli script bash.
- — qui sono presentate tecniche per gestire messaggi da inviare agli utenti, così come metodologie per il monitoraggio del disco.
- — questo materiale è dedicato allo strumento Expect, che consente di automatizzare l'interazione con strumenti interattivi. In particolare, si discute di script expect e della loro interazione con script bash e altri programmi.
Riteniamo che una delle caratteristiche più preziose di questa serie di articoli sia che, partendo dal più semplice, adatto a utenti di ogni livello, conduce gradualmente a temi piuttosto complessi, dando a tutti la possibilità di avanzare nella creazione di script per la riga di comando di Linux.
Gentili lettori! Chiediamo ai guru della programmazione bash di raccontarci come sono arrivati ai vertici della loro maestria, di condividere i loro segreti, e ci aspettiamo impressioni da chi ha appena scritto il proprio primo script.
Solo gli utenti registrati possono partecipare al sondaggio. , per favore.
Dobbiamo tradurre le altre parti della serie di articoli?
Sì!
No, non è necessario
Hanno votato 1030 utenti. 106 utenti si sono astenuti.
Fonte: habr.com
