Ricerca nel sito web

Come creare semplici script di shell in Linux


La creazione di script di shell è una delle competenze più essenziali che gli utenti Linux dovrebbero avere a portata di mano. Gli script di shell svolgono un ruolo enorme nell'automazione di attività ripetitive che altrimenti sarebbero noiose da eseguire riga per riga.

In questo tutorial, evidenziamo alcune delle operazioni base di scripting della shell che ogni utente Linux dovrebbe avere.

1. Crea un semplice script di shell

Uno script di shell è un file che comprende testo ASCII. Inizieremo creando un semplice script di shell e per farlo utilizzeremo un editor di testo. Esistono numerosi editor di testo, sia da riga di comando che basati su GUI. Per questa guida utilizzeremo l'editor vim.

Inizieremo creando un semplice script che visualizza "Hello world" quando viene eseguito.

vim hello.sh

Incolla il seguente contenuto nel file e salva.

#!/bin/bash
Print Hello world message
echo "Hello World!"

Esaminiamo lo script della shell riga per riga.

  • La prima riga – #!/bin/bash – è nota come intestazione shebang. Questo è un costrutto speciale che indica quale programma verrà utilizzato per interpretare lo script. In questo caso, questa sarà la shell bash indicata da /bin/bash. Esistono altri linguaggi di scripting come Python che è indicato con #!/usr/bin/python3 e Perl la cui intestazione shebang è indicata con #!/usr/bin/perl.
  • La seconda riga è un commento. Un commento è un'istruzione che descrive cosa fa uno script di shell e non viene eseguita quando lo script viene eseguito. I commenti sono sempre preceduti dal cancelletto #.
  • L'ultima riga è il comando che stampa il messaggio "Hello World" sul terminale.

Il passaggio successivo è rendere eseguibile lo script assegnando l'autorizzazione di esecuzione utilizzando il comando chmod come mostrato.

chmod +x  hello.sh

Infine, esegui lo script della shell utilizzando uno dei comandi:

bash hello.sh
OR
./hello.sh

2. Utilizzo di istruzioni condizionali per eseguire il codice

Come altri linguaggi di programmazione, le dichiarazioni condizionali vengono utilizzate negli script bash per prendere decisioni, con solo una leggera variazione nella sintassi. Tratteremo le istruzioni condizionali if, if-else e elif.

Esempio di un'istruzione if Only

L'istruzione if può essere utilizzata per testare condizioni singole o multiple. Inizieremo con l'uso fondamentale dell'istruzione if per testare una singola condizione. L'istruzione if è definita dai blocchi if ... fi.

if command
then
  statement
fi

Diamo un'occhiata allo script di shell qui sotto.

#!/bin/bash
echo 'Enter the score'
read x

if [[ $x == 70 ]]; then
  echo 'Good job!'
fi

Lo script di shell sopra richiede all'utente di fornire un punteggio che viene poi memorizzato in una variabile x. Se il punteggio corrisponde a 70, lo script restituisce l'output “Buon lavoro!”. L'operatore di confronto == viene utilizzato per verificare se il punteggio inserito, memorizzato nella variabile x, equivale a 100.

Altri operatori di confronto che puoi utilizzare includono:

  • -eq – Uguale a
  • -ne – Diverso da
  • -lt – Meno di
  • -le – Minore o uguale a
  • -lt – Meno di
  • -ge – Maggiore o uguale a

Ad esempio, il blocco if-statement riportato di seguito stampa "Work Harder" se il punteggio di input è un valore inferiore a 50.

if [[ $x -lt 50 ]]; then
  echo 'Work Harder!'
fi

Esempio di un'istruzione if-else

Per le situazioni in cui hai 2 possibili risultati: – se questo o quello – l'istruzione if-else torna utile.

if command
then
  statement1
else
  statement2
fi

Lo script seguente legge il punteggio immesso e controlla se è maggiore o uguale a 70.

Se il punteggio è maggiore o uguale a 70, riceverai il messaggio "Ottimo lavoro, hai superato!". Tuttavia, se il punteggio scende al di sotto di 70, verrà stampato l'output "Hai fallito".

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -ge 70 ]]; then
  echo 'Great job, You passed!'
else
  echo  'You failed'
fi

Esempio di un'istruzione if-elif-else

Negli scenari in cui sono presenti più condizioni e risultati diversi, viene utilizzata l'istruzione if-elif-else. Questa affermazione assume il seguente formato.

if condition1
then
  statement1
elif condition2
then
  statement2
else
  statement3
fi

Ad esempio, abbiamo uno script per una lotteria che controlla se il numero inserito è 90, 60 o 30.

#!/bin/bash

echo 'Enter the score'

read x

if [[ $x -eq 90 ]];
then
  echo “You have won the First Prize”

elif [[ $x -eq 60 ]];
then
  echo “You have won the Second Prize”

elif [[ $x -eq 30 ]];
then 
  echo “You have won the Second Prize”
else
  echo “Please try again”
fi

3. Utilizzo dell'istruzione If con la logica AND

Puoi utilizzare l'istruzione if insieme all'operatore logico AND per eseguire un'attività se due condizioni sono soddisfatte. L'operatore && viene utilizzato per denotare la logica AND.

#!/bin/bash

echo 'Please Enter your user_id'
read user_id

echo 'Please Enter your tag_no'
read tag_id

if [[ ($user_id == “tecmint” && $tag_id -eq 3990) ]];
then
  echo “Login successful”
else
  echo “Login failure”
fi

5. Utilizzo dell'istruzione If con la logica OR

Quando si utilizza la logica OR, rappresentata dal simbolo ||, una delle condizioni deve essere soddisfatta dallo script per fornire i risultati attesi.

#!/bin/bash

echo 'Please enter a random number'
read number

if [[ (number -eq 55 || number -eq 80) ]];
then
 echo 'Congratulations! You’ve won'
else
 echo 'Sorry, try again'
fi

Usa costrutti di loop

I loop di Bash consentono agli utenti di eseguire una serie di attività fino al raggiungimento di un determinato risultato. Ciò è utile quando si eseguono attività ripetitive. In questa sezione daremo uno sguardo ad alcuni dei loop che potresti trovare anche in altri linguaggi di programmazione.

Mentre il ciclo

Questo è uno dei loop più facili con cui lavorare. La sintassi è abbastanza semplice:

while  <some test>
do
 commands
done

Il ciclo while seguente elenca tutti i numeri da 1 a 10 quando viene eseguito.

#!/bin/bash
A simple while loop
counter=1
while [ $counter -le 10 ]
 do
echo $counter
 ((counter++))
done

Parliamo del ciclo while:

La variabile contatore viene inizializzata su 1. E mentre la variabile è inferiore o uguale a 10, il valore del contatore verrà incrementato finché la condizione non sarà soddisfatta. La riga echo $counter stampa tutti i numeri da 1 a 10.

Per ciclo

Come il ciclo while, un ciclo for viene utilizzato per eseguire il codice in modo iterativo. Cioè. ripetere l'esecuzione del codice il maggior numero di volte possibile definito dall'utente.

La sintassi è:

for var in 1 2 3 4 5 N
do
 command1
 command2
done

Il ciclo for riportato di seguito scorre da 1 a 10 ed elabora i relativi valori sullo schermo.

Un modo migliore per raggiungere questo obiettivo è definire un intervallo utilizzando le doppie parentesi graffe { } come mostrato invece di digitare tutti i numeri.

#!/bin/bash
Specify range in a for loop

for num in {1..10}
do
  echo $num
done

Parametri posizionali di Bash

Un parametro posizionale è una variabile speciale a cui si fa riferimento nello script quando i valori vengono passati alla shell ma non possono essere assegnati. I parametri posizionali vanno da $0 $1 $2 $3 …… a $9. Oltre il valore $9, i parametri devono essere racchiusi tra parentesi graffe, ad esempio $ {10}, $ {11} … e così via.

Quando si esegue lo script, il primo parametro posizionale che è $0 prende il nome dello script di shell. Il parametro $1 prende la prima variabile passata al terminale, $2 prende la seconda, $3 la terza e così via.

Creiamo uno script test.sh come mostrato.

#!/bin/bash
echo "The name of the script is: " $0
echo "My first name is: " $1
echo "My second name is: " $2

Successivamente, esegui lo script e fornisci il primo e il secondo nome come argomenti:

bash test.sh James Kiarie

Dall'output, possiamo vedere che la prima variabile che viene stampata è il nome dello script di shell, in questo caso test.sh. Successivamente, i nomi vengono stampati corrispondenti ai parametri posizionali definiti nello script di shell.

I parametri posizionali sono utili in quanto aiutano a personalizzare i dati immessi invece di assegnare esplicitamente un valore a una variabile.

Codici di uscita dei comandi Shell

Iniziamo rispondendo a una semplice domanda: cos'è un codice di uscita?

Ogni comando eseguito sulla shell da un utente o da uno script di shell ha uno stato di uscita. Uno stato di uscita è un numero intero.

Uno stato di uscita pari a 0 implica che il comando è stato eseguito correttamente senza errori. Un valore compreso tra 1 e 255 indica che il comando non è riuscito o non è stato eseguito correttamente.

Per trovare lo stato di uscita di un comando, utilizzare la variabile Shell $?.

Uno stato di uscita pari a 1 indica un errore generale o eventuali errori non consentiti come la modifica di file senza autorizzazioni sudo.

Uno stato di uscita pari a 2 indica un utilizzo errato di un comando o di una variabile di shell incorporata.

Lo stato di uscita 127 indica un comando illegale che di solito restituisce l'errore "comando non trovato".

Elaborazione dell'output dei comandi della shell all'interno di uno script

Negli script bash è possibile memorizzare l'output di un comando in una variabile per un uso futuro. Questa operazione viene definita anche sostituzione dei comandi di shell e può essere ottenuta nei seguenti modi.

variable=$(command)
OR
variable=$(/path/to/command)
OR
variable=$(command argument 1 argument 2 ...)

Ad esempio, puoi memorizzare il comando date in una variabile chiamata oggi e chiamare lo script della shell per rivelare la data corrente.

#!/bin/bash

today=$(date)

echo “Today is $today”

Facciamo un altro esempio. Supponiamo che tu voglia trovare gli utenti di accesso validi sul tuo sistema Linux. Come procederesti? Innanzitutto, l'elenco di tutti gli utenti (sia di sistema, di processo e di accesso) viene memorizzato nel file /etc/passwd.

Per visualizzare il file, dovresti utilizzare il comando cat. Tuttavia, per restringere il campo degli utenti che accedono, utilizza il comando grep per cercare gli utenti con l'attributo /bin/bash e utilizza il comando cut -c 1-10 come mostrato per visualizzare i primi 10 caratteri dei nomi.

Abbiamo memorizzato il comando cat nella variabile login_users.

#!/bin/bash
login_users=$(cat /etc/passwd | grep /bin/bash | cut -c 1-10)
echo 'This is the list of login users:
echo $login_users

Questo conclude il nostro tutorial sulla creazione di semplici script di shell. Ci auguriamo che tu lo abbia trovato prezioso.