Shell scripting (bash)
Uno script di shell è un file di testo con una lista di comandi di shell e viene eseguito come un programma per eseguire un compito o un insieme di compiti. Lo scopo principale di uno script di shell è quello di automatizzare i compiti e risparmiare tempo. È importante capire la struttura di base di uno script di shell, dal momento che si interagisce con un cluster di calcolo tramite script di shell (Vedi il prossimo capitolo su Grid Engine)
che cos’è Bash ?
Ci sono molte diverse shell disponibili nei sistemi Unix-like. La Bourne Again Shell (Bash) è una di queste, è la shell predefinita nei sistemi GNU/Linux. Ha alcuni vantaggi rispetto ad altre shell ed è praticamente la shell standard, e mostreremo come usarla per lo scripting qui sotto.
Scrivere un semplice script di shell bash
Uno script di shell di base è solo una serie di comandi. Questo è ciò che mostreremo in seguito.
Scriviamo un semplice script che emette “hello world” sullo schermo usando il comando echo
. Salveremo il file di testo come myScript.sh
#!/bin/bash echo Hello World
eseguendo la sintassi di uno script di shell:bash your-script-name
. Nel nostro caso, scriviamo:
$ bash myScript.sh Hello World
esempio più complicato
Scriviamo uno script un po’ più complicato usando più comandi di shell. Lo script usa il ls
per elencare i file e usa il comando wc -l
che conta il numero di linee in un dato file o standard input. In questo caso, wc -l
conta il numero di linee nell’output di ls -l
. Tutto questo si ottiene usando la pipe |
.
contenuti dello script.sh:
#!/bin/bash echo here are the list of files ls -l echo The number of files: ls -l | wc -l
Possiamo eseguirlo come segue:
$ bash script.sh
variabili negli script bash
Si possono usare anche variabili negli script bash. Che sono utili per catturare l’output di comandi intermedi e usarli per eseguire altri comandi.Non ci sono tipi di dati per le variabili. Una variabile in bash può contenere uno dei seguenti elementi: un numero, un carattere o una stringa di caratteri.
Non è necessario dichiarare una variabile, basta assegnare un valore al suo riferimento per crearla.
Ora creeremo un semplice script con una variabile. Assegneremo Hello world
stringa a quella variabile e stamperemo quella variabile con echo
.
#!/bin/bash VAR="Hello world" echo $VAR
Quando assegniamo la variabile non abbiamo usato il segno $
, ma quando usiamo la variabile dobbiamo usare il segno $
.
argomenti della linea di comando negli script bash
Lo script può anche prendere argomenti della linea di comando. Qui modifichiamo lo script che elenca il file per prendere un argomento da linea di comando. L’argomento sarà un percorso di una directory.
Contenuto dello script2.sh:
#!/bin/bash VAR= echo here are the list of files ls -l $VAR echo The number of files: ls -l $VAR | wc -l
Ecco come si esegue lo script:
$ bash script2.sh /home/user/project
Gli argomenti sono memorizzati in variabili con un numero nell’ordine dell’argomento a partire da 1
- Primo argomento: $1
- Secondo argomento: $2
- e così via…
Nel nostro caso, corrisponde a
/home/user/project
.
Operazioni aritmetiche script bash
Le operazioni aritmetiche sui numeri interi in bash sono fatte nel seguente formato:
#!/bin/bash x=6 y=2 $((10 - 5)) $((x-y)) echo $((x-y)) echo $((10-5))
Puoi anche copiare e incollare questi comandi nella console per vedere come funzionano. I comandi echo
dovrebbero produrre 4
e 5
.
L’aritmetica di bash non supporta i punti fluttuanti (ad esempio, l’operazione 1.3 -1 non funzionerà in bash), è necessario utilizzare il comando bc
. Vedi questo esempio di stackOverflow per un esempio su come usare bc
.
Looping sui file
Se stai cercando di automatizzare un compito usando lo scripting bash, è molto probabile che tu debba applicare certi comandi su ogni file in una directory. Questo potrebbe essere ottenuto con i caratteri jolly*
e i cicli for
. Il seguente script memorizza tutti i file ‘.txt’ nella directory /path/to
nella variabile FILES
. Poi, per ogni file calcola il numero di linee e lo visualizza con il comando wc -l
.
#!/bin/bash FILES=/path/to/*.txt for f in $FILES do echo "Processing $f file..." # count number of lines and output that for file $f wc -l $f done
Più sugli script bash
Si possono scrivere script di shell ancora più complicati usando strutture di controllo (cicli if/else, for/while) e ottenere molto solo usando lo script di shell, ma questo va oltre lo scopo del documento. Vedi i link qui sotto se vuoi migliorare nella scrittura di script di shell.
- http://www.freeos.com/guides/lsst/
- http://www.tldp.org/LDP/Bash-Beginners-Guide/html/