Oggi parleremo degli script bash. Questo - 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 tutti, l'unica condizione è la capacità di lavorare riga di comando Linux.
Gli script da riga di comando sono raccolte degli stessi comandi che possono essere immessi dalla tastiera, raccolti in file e uniti da uno scopo comune. In questo caso, i risultati del lavoro dei team possono avere valore indipendente o servire come dati di input per altri team. Gli script sono un modo efficace per automatizzare le azioni eseguite di frequente.
Quindi, se parliamo di riga di comando, ti permette di eseguire più comandi contemporaneamente inserendoli separati da un punto e virgola:
pwd ; whoami
In effetti, se lo hai provato nel tuo terminale, il tuo primo script bash che coinvolge due comandi è già stato scritto. Funziona così. Prima la squadra pwd visualizza le informazioni sulla directory di lavoro corrente, quindi il comando whoamimostra le informazioni sull'utente con cui hai effettuato l'accesso.
Utilizzando questo approccio, puoi combinare tutti i comandi che desideri su una riga, l'unico limite è il numero massimo di argomenti che possono essere passati al programma. È possibile definire questo limite utilizzando il seguente comando:
getconf ARG_MAX
La riga di comando è un ottimo strumento, ma devi inserirvi i comandi ogni volta che ne hai bisogno. Cosa succederebbe se scrivessimo una serie di comandi in un file e chiamassimo semplicemente quel file per eseguirli? In effetti, il file di cui stiamo parlando si chiama script da riga di comando.
Come funzionano gli script bash
Crea un file vuoto usando il comando touch. La sua prima riga deve indicare quale shell utilizzeremo. Siamo interessati a bash, quindi la prima riga del file sarà:
#!/bin/bash
Altre righe in questo file utilizzano il simbolo cancelletto per indicare commenti che la shell non elabora. Tuttavia, la prima riga è un caso speciale, c'è un cancelletto seguito da un punto esclamativo (questa sequenza si chiama shebang) e il percorso verso bash, indica al sistema per cui lo script è stato creato appositamente bash.
I comandi della shell sono separati da un avanzamento riga, i commenti sono separati da un cancelletto. Ecco come appare:
#!/bin/bash
# This is a comment
pwd
whoami
Qui, proprio come nella riga di comando, puoi scrivere i comandi su una riga, separati da punto e virgola. Tuttavia, se si scrivono i comandi su righe diverse, il file risulta più semplice da leggere. In ogni caso, la shell li elaborerà.
Impostazione delle autorizzazioni per i file di script
Salvare il file dandogli un nome myscripte il lavoro di creazione dello script bash è quasi terminato. Adesso non resta che rendere eseguibile questo file altrimenti, se provi ad eseguirlo, riscontrerai un errore Permission denied.
Tentativo di eseguire un file di script con autorizzazioni configurate in modo errato
Rendiamo eseguibile il file:
chmod +x ./myscript
Ora proviamo ad eseguirlo:
./myscript
Dopo aver impostato i permessi tutto funziona come dovrebbe.
Esecuzione dello script bash riuscita
Uscita del messaggio
Per inviare testo alla console Linux, utilizzare il comando echo. Usiamo la conoscenza di questo fatto e modifichiamo il nostro script, aggiungendo spiegazioni ai dati che vengono emessi dai comandi già presenti in esso:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
Questo è ciò che accade dopo aver eseguito lo script aggiornato.
Emissione di messaggi da uno script
Ora possiamo visualizzare le note esplicative utilizzando il comando echo. Se non sai come modificare un file utilizzando gli strumenti Linux o non hai mai visto il comando prima echo, dare un'occhiata a questo материал.
Utilizzo delle variabili
Le variabili consentono di archiviare informazioni in un file di script, ad esempio i risultati dei comandi, per utilizzarle con altri comandi.
Non c'è niente di sbagliato nell'eseguire singoli comandi senza memorizzarne i risultati, ma questo approccio ha capacità piuttosto limitate.
Esistono due tipi di variabili che possono essere utilizzate negli script bash:
variabili ambientali
Variabili utente
variabili ambientali
A volte i comandi della shell devono funzionare con alcuni dati di sistema. Ecco un esempio di come visualizzare la directory home dell'utente corrente:
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
Tieni presente che possiamo utilizzare una variabile di sistema $HOME tra virgolette doppie, ciò non impedirà al sistema di riconoscerlo. Questo è ciò che ottieni se esegui lo scenario sopra.
Utilizzo di una variabile di ambiente in uno script
Cosa succede se hai bisogno di visualizzare il simbolo del dollaro sullo schermo? Proviamo questo:
echo "I have $1 in my pocket"
Il sistema rileverà il simbolo del dollaro in una stringa tra virgolette e presumerà che abbiamo fatto riferimento a una variabile. Lo script tenterà di visualizzare il valore di una variabile non definita $1. Non è questo ciò di cui abbiamo bisogno. Cosa fare?
In questa situazione, utilizzare il carattere escape, una barra rovesciata, prima del simbolo del dollaro aiuterà:
echo "I have $1 in my pocket"
Lo script ora restituirà esattamente ciò che è previsto.
Utilizzo di una 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. Tali variabili mantengono un valore finché lo script non completa l'esecuzione.
Come per le variabili di sistema, è possibile accedere alle variabili utente 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"
Questo è ciò che accade dopo aver eseguito uno script del genere.
Variabili personalizzate in uno script
Sostituzione dei comandi
Una delle funzionalità più utili degli script bash è la capacità di estrarre informazioni dall'output del comando e assegnarle a variabili, consentendo di utilizzare queste informazioni ovunque nel file di script.
Questo può essere fatto in due modi.
Utilizzando l'apice inverso "`"
In base alla progettazione $()
Quando si utilizza il primo approccio, fare attenzione a non includere una virgoletta singola al posto dell'apice inverso. Il comando deve essere racchiuso tra due di queste icone:
mydir=`pwd`
Nel secondo approccio, la stessa cosa è scritta in questo modo:
mydir=$(pwd)
E lo script potrebbe risultare simile a questo:
#!/bin/bash
mydir=$(pwd)
echo $mydir
Durante il suo funzionamento, l'output del comando pwdverrà salvato in una variabile mydir, il cui contenuto, utilizzando il comando echo, andrà alla console.
Uno script che salva i risultati di un comando in una variabile
Operazioni matematiche
Per eseguire operazioni matematiche in un file di script, puoi utilizzare un costrutto come $((a+b)):
In alcuni scenari è necessario controllare il flusso di esecuzione dei comandi. Ad esempio, se un determinato valore è maggiore di cinque, è necessario eseguire un'azione, altrimenti un'altra. Questo è applicabile in molte situazioni, e qui la struttura di controllo ci aiuterà if-then. Nella sua forma più semplice assomiglia a questo:
if команда
then
команды
fi
Ecco un esempio funzionante:
#!/bin/bash
if pwd
then
echo "It works"
fi
In questo caso, se il comando viene eseguito pwdverrà completato con successo, nella console verrà visualizzato il testo "funziona".
Usiamo la conoscenza che abbiamo e scriviamo uno script più complesso. Diciamo che dobbiamo trovare un determinato utente in /etc/passwd, e se sei riuscito a trovarlo segnala che esiste.
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd
then
echo "The user $user Exists"
fi
Questo è ciò che accade dopo aver eseguito questo script.
Ricerca utente
Qui abbiamo usato il comando grepper cercare un utente in un file /etc/passwd. Se la squadra grepnon ti è familiare, puoi trovarne la descrizione qui.
In questo esempio, se l'utente viene trovato, lo script visualizzerà un messaggio corrispondente. Cosa succede se l'utente non viene trovato? In questo caso lo script completerà semplicemente l'esecuzione senza dirci nulla. Ci piacerebbe che ci parlasse anche di questo, così miglioreremo il codice.
costrutto di controllo if-then-else
Affinché il programma possa riportare sia i risultati di una ricerca riuscita che quella fallita, utilizzeremo la costruzione if-then-else. Ecco come funziona:
if команда
then
команды
else
команды
fi
Se il primo comando restituisce zero, il che significa che è stato eseguito con successo, la condizione sarà vera e l'esecuzione non proseguirà lungo il ramo else. Altrimenti, se viene restituito qualcosa di diverso da zero, il che indicherebbe un errore o un risultato falso, i comandi successivi else.
Scriviamo il seguente script:
#!/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 in malora else.
Esecuzione di uno script con un costrutto if-then-else
Bene, andiamo avanti e interroghiamoci su condizioni più complesse. Cosa succede se è necessario verificare non una condizione, ma diverse? Ad esempio, se viene trovato l'utente desiderato, dovrebbe essere visualizzato un messaggio, se viene soddisfatta qualche altra condizione, dovrebbe essere visualizzato un altro messaggio e così via. In una situazione del genere, le condizioni nidificate ci aiuteranno. Sembra questo:
if команда1
then
команды
elif команда2
then
команды
fi
Se il primo comando restituisce zero, il che indica la sua corretta esecuzione, verranno eseguiti i comandi nel primo blocco then, altrimenti, se la prima condizione è 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 di questo tipo è possibile, ad esempio, creare un nuovo utente utilizzando il comando useradd, se la ricerca non ha prodotto risultati, oppure fai qualcos'altro di utile.
Confronto di numeri
Negli script è possibile confrontare valori numerici. Di seguito è riportato un elenco dei comandi pertinenti.
n1 -eq n2Restituisce vero se n1 è n2. n1 -ge n2 Restituisce vero se n1più o uguale n2. n1 -gt n2Restituisce vero se n1 più n2. n1 -le n2Restituisce vero se n1inferiore o uguale n2. n1 -lt n2Restituisce vero se n1 è minore di n2. n1 -ne n2Restituisce vero se n1non uguale n2.
Ad esempio, proviamo uno degli operatori di confronto. Si noti 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
Questo è ciò che verrà restituito da questo comando.
Confronto di numeri negli script
Valore variabile val1maggiore di 5, il ramo finisce per essere eseguito thenoperatore di confronto e nella console viene visualizzato un messaggio corrispondente.
Confronto di stringhe
Gli script possono anche confrontare valori di stringa. Gli operatori di confronto sembrano abbastanza semplici, ma le operazioni di confronto tra stringhe hanno alcune caratteristiche, che tratteremo di seguito. Ecco l'elenco degli operatori.
str1 = str2 Verifica l'uguaglianza delle stringhe, restituendo true se le stringhe sono identiche.
str1 != str2Restituisce vero se le stringhe non sono identiche. str1 < str2Restituisce vero se str1meno di str2. str1 > str2 Restituisce vero se str1più di str2. -n str1 Restituisce vero se lunghezza str1Sopra lo zero. -z str1Restituisce vero se lunghezza str1uguale 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
Come risultato dell'esecuzione dello script, otteniamo quanto segue.
Confronto di stringhe negli script
Ecco una caratteristica del confronto tra stringhe che vale la pena menzionare. Vale a dire, gli operatori ">" e "<" devono essere preceduti da una barra rovesciata, altrimenti lo script non funzionerà correttamente, anche se non verrà visualizzato alcun messaggio di errore. Lo script interpreta il segno ">" come un comando di reindirizzamento dell'output.
Ecco come funziona 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 della sceneggiatura.
Confronto di stringhe, avviso fornito
Tieni presente che lo script, sebbene eseguito, emette un avviso:
./myscript: line 5: [: too many arguments
Per sbarazzarci di questo avvertimento, concludiamo $val2 tra virgolette doppie:
#!/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 tutto funziona come dovrebbe.
Confronto di stringhe
Un'altra caratteristica degli operatori ">" e "<" è il modo in cui funzionano con i caratteri maiuscoli e minuscoli. Per comprendere questa funzionalità, prepariamo un file di testo con il seguente contenuto:
Likegeeks
likegeeks
Salviamolo dandogli un nome myfile, quindi esegui il seguente comando nel terminale:
sort myfile
Ordinarà le righe dal file in questo modo:
likegeeks
Likegeeks
Squadra sort, per impostazione predefinita, ordina le stringhe in ordine crescente, ovvero la lettera minuscola nel nostro esempio è più piccola di 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"
fi
Se lo esegui, si scopre che tutto è al contrario: la lettera minuscola ora è più grande di quella maiuscola.
Il comando sort e il confronto delle stringhe in un file di script
Nei comandi di confronto, le lettere maiuscole sono più piccole delle lettere minuscole. Il confronto delle stringhe in questo caso viene eseguito confrontando i codici ASCII dei caratteri, l'ordinamento dipende quindi dai codici dei caratteri.
Squadra sort, a sua volta, utilizza l'ordinamento specificato nelle impostazioni della lingua del sistema.
Controlli sui file
Forse i seguenti comandi vengono utilizzati più spesso negli script bash. Ti consentono di verificare varie condizioni relative ai file. Ecco un elenco di questi comandi.
-d fileControlla se un file esiste ed è una directory. -e fileControlla se il file esiste. -f file Controlla se un file esiste ed è un file. -r fileControlla se il file esiste ed è leggibile. -s file ПControlla 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 file1Di file2. file1 -ot file2Controlla se è più vecchio file1Di 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 all'ID di gruppo dell'utente corrente.
Questi comandi, così come molti altri discussi oggi, sono facili da ricordare. I loro nomi, essendo abbreviazioni di varie parole, indicano direttamente i controlli che eseguono.
Proviamo in pratica uno dei comandi:
#!/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, ne visualizzerà il contenuto.
Elencare il contenuto di una directory
Crediamo che tu possa sperimentare tu stesso con i restanti comandi; sono tutti utilizzati secondo lo stesso principio.
Risultati di
Oggi abbiamo parlato di come iniziare a scrivere script bash e abbiamo trattato alcune cose di base. In effetti, l'argomento della programmazione bash è enorme. Questo articolo è una traduzione della prima parte di una vasta serie di 11 materiali. Se vuoi continuare subito, ecco un elenco degli originali di questi materiali. Per comodità riportiamo qui la traduzione che avete appena letto.
Script Bash passo dopo passo - qui stiamo parlando di come iniziare a creare script bash, viene considerato l'uso delle variabili, vengono descritte le strutture condizionali, i calcoli, i confronti di numeri, stringhe e la scoperta di informazioni sui file.
Bash Scripting Parte 3, Parametri e opzioni — questo materiale è dedicato ai parametri della riga di comando e alle chiavi che possono essere passate agli script, lavorando con i dati immessi dall'utente e che possono essere letti dai file.
Bash Scripting Parte 4, Input e Output - qui stiamo parlando di descrittori di file e di come lavorare con essi, di input, output, flussi di errori e di reindirizzamento dell'output.
Bash Scripting Parte 5, Sigals e Jobs — questo materiale è dedicato ai segnali Linux, alla loro elaborazione negli script e al lancio degli script secondo una pianificazione.
Bash Scripting Parte 6, Funzioni — qui puoi apprendere come creare e utilizzare le funzioni negli script e come sviluppare le librerie.
Bash Scripting Parte 10, Esempi pratici — ecco le tecniche per lavorare con i messaggi che possono essere inviati agli utenti, nonché un metodo per il monitoraggio del disco.
Bash Scripting Parte 11, Aspettatevi il comando — questo materiale è dedicato allo strumento Expect, con il quale è possibile automatizzare l'interazione con le utilità interattive. In particolare, stiamo parlando degli script aspettati e della loro interazione con gli script bash e altri programmi.
Crediamo che una delle caratteristiche preziose di questa serie di articoli sia che, partendo dal più semplice, adatto a utenti di qualsiasi livello, porta gradualmente ad argomenti piuttosto seri, dando a tutti la possibilità di avanzare nella creazione di script a riga di comando Linux .
Cari lettori! Chiediamo ai guru della programmazione bash di parlare di come hanno raggiunto l'apice della loro maestria, di condividere i loro segreti e non vediamo l'ora di ricevere impressioni da coloro che hanno appena scritto il loro primo script.
Solo gli utenti registrati possono partecipare al sondaggio. AccediPer favore.
Devo tradurre il resto della serie di articoli?
Sì!
No, non ce n'è bisogno
1030 utenti hanno votato. 106 utenti si sono astenuti.