Bash scripting: introduzione

Bash scripting: introduzione
Bash scripting, parte 2: cicli
Bash scripting, parte 3: parametri e opzioni della riga di comando
Bash scripting, parte 4: input e output
Bash scripting, parte 5: segnali, processi in background e gestione degli script
Bash scripting, parte 6: funzioni e sviluppo di librerie
Bash scripting, parte 7: sed e manipolazione del testo
Bash scripting, parte 8: linguaggio di elaborazione dei dati awk
Bash scripting, parte 9: espressioni regolari
Bash scripting, parte 10: esempi pratici
Bash scripting, parte 11: expect e automazione di utilità interattive

Oggi parleremo di bash scripting. Questo è uno script della riga di comando, 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 riga di comando di Linux.

Bash scripting: introduzione

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.

Bash scripting: introduzione

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_MAX

La 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 shebang) 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
whoami

Qui, 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.

Bash scripting: introduzione
Tentativo di eseguire il file dello script con permessi configurati in modo errato

Rendiamo il file eseguibile:

chmod +x ./myscript

Ora proviamo a eseguirlo:

./myscript

Dopo aver impostato i permessi, tutto funziona come si deve.

Bash scripting: introduzione
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:"
whoami

Ecco cosa otterremo dopo aver eseguito lo script aggiornato.

Bash scripting: introduzione
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 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.

Bash scripting: introduzione
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.

Bash scripting: introduzione
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.

Bash scripting: introduzione
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.

Bash scripting: introduzione
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

Bash scripting: introduzione
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
fi

Ecco 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"
fi

Ecco cosa otteniamo dopo l'esecuzione di questo script.

Bash scripting: introduzione
Ricerca utente

Qui abbiamo usato il comando grepper cercare l'utente nel file /etc/passwd. Se il comando grepti è sconosciuto, puoi trovarne la descrizione. qui.

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.

Bash scripting: introduzione
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 se n1 è uguale a n2.
n1 -ge n2 Restituisce un valore vero se n1maggiore o uguale n2.
n1 -gt n2Restituisce un valore vero se n1 maggiore n2.
n1 -le n2Restituisce un valore vero se n1minore o uguale n2.
n1 -lt n2Restituisce un valore vero se n1 è minore di n2.
n1 -ne n2Restituisce un valore vero se n1non uguale a n2.

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"
fi

Ecco cosa restituirà questo comando.

Bash scripting: introduzione
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 = str2 Controlla se le stringhe sono uguali, restituisce vero se le stringhe sono identiche.
sstr1 != str2Restituisce vero se le stringhe non sono identiche.
str1 < str2Restituisce vero se str1è minore di str2.
str1 > str2 Restituisce vero se str1è maggiore di str2.
-n str1 Restituisce vero se la lunghezza str1è maggiore di zero.
-z str1Restituisce vero se la lunghezza str1è 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"
fi

Di conseguenza, l'esecuzione dello script restituirà quanto segue.

Bash scripting: introduzione
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"
fi

Ecco i risultati dell'esecuzione dello script.

Bash scripting: introduzione
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"
fi

Ora funziona tutto come dovrebbe.

Bash scripting: introduzione
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 myfile

Esso 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"
fi

Se lo eseguiamo, scopriremo che è tutto il contrario: la lettera minuscola ora è considerata maggiore della maiuscola.

Bash scripting: introduzione
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 file Controlla 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 file2 Controlla se è più recente di file1, rispetto a file2.
file1 -ot file2Controlla se è più vecchio di file1, rispetto a file2.
-O file Controlla 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"
fi

Questo script, per una directory esistente, mostrerà il suo contenuto.

Bash scripting: introduzione
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.

  1. Bash Script Passo Dopo Passo — 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.
  2. Bash Scripting Parte 2, Bash l'eccezionale — qui si rivelano le caratteristiche del lavoro con i cicli for e while.
  3. Bash Scripting Parte 3, Parametri & opzioni — 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.
  4. Bash Scripting Parte 4, Input & Output — qui si parla dei descrittori di file e del loro utilizzo, dei flussi di input, output, errori e di come reindirizzare l'output.
  5. Bash Scripting Parte 5, Segnali & Lavori — questo materiale è dedicato ai segnali di Linux, alla loro elaborazione negli script e all'avvio di script pianificati.
  6. Bash Scripting Parte 6, Funzioni — qui puoi scoprire come creare e utilizzare funzioni negli script e sviluppare librerie.
  7. Bash Scripting Parte 7, Usare sed — questo articolo è dedicato al lavoro con l'editor di testo in streaming sed.
  8. Bash Scripting Parte 8, Usare awk — questo materiale tratta della programmazione nel linguaggio di elaborazione dati awk.
  9. Bash Scripting Parte 9, Espressioni Regolari — qui puoi leggere sull'uso delle espressioni regolari negli script bash.
  10. Bash Scripting Parte 10, Esempi Pratici — qui sono presentate tecniche per gestire messaggi da inviare agli utenti, così come metodologie per il monitoraggio del disco.
  11. Bash Scripting Parte 11, Comando Expect — 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.

Bash scripting: introduzione

Solo gli utenti registrati possono partecipare al sondaggio. Accedi, 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

Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster