Bash tutorial
Da PiemonteWireless.
Indice |
Introduzione agli script /bin/bash
Hello World
Per prima cosa occorre scoprire dove si trova il programma bash (solitamente è /bin/bash):
$ which bash /bin/bash
Adesso creiamo un nuovo file hw.sh con questo contenuto:
#!/bin/bash # declare STRING variable STRING="Hello World" # print variable on a screen echo $STRING
e rendiamolo eseguibile, quindi avviamolo.
$ chmod a+x hw.sh $ ./hw.sh Hello World $
Notiamo che ogni script di bash inizia col la riga:
#!/bin/bash
e che il commento si ottiene con un cancelletto:
# declare STRING variable
Variabili
Le variabili si definiscono semplicemente con VARIABILE=valore e si chiamano con $VARIABILE.
#!/bin/bash OF=myhome_directory_$(date +%Y%m%d).tar.gz tar -czf $OF /home/linuxconfig
Le variabili definite dentro una funzione sono locali e non si vedono all'esterno della funzione:
#!/bin/bash
# Definisco una variabile globale (può essere vista in tutto lo script)
VAR="variable globale"
function bash {
# Definisco una variabile locale (può essere vista solo all'interno della funzione)
local VAR="variable locale"
echo $VAR
}
echo $VAR
bash
echo $VAR
l'output dello script è:
variable globale variable locale variable globale
Passare argomenti ad uno script bash
#!/bin/bash
# uso delle variabili predefinite per accedere agli argomenti passati da riga di comando
# $1 è il primo argomento, $2 il secondo e così via...
echo $1 $2 $3 ' -> echo $1 $2 $3'
# registriamo gli argomenti in un array speciale
args=("$@")
echo ${args[0]} ${args[1]} ${args[2]} ' -> args=("$@"); echo ${args[0]} ${args[1]} ${args[2]}'
# uso $@ per stampare tutti gli argomenti in una volta sola
echo $@ ' -> echo $@'
# uso $# per stampare il numero di argomnenti
echo Numero di argomento passati: $# ' -> echo Numero di argomento passati: $#'
Eseguo lo script:
$ ./args.sh Primo Secondo Terzo
Primo Secondo Terzo -> echo $1 $2 $3
Primo Secondo Terzo -> args=("$@"); echo ${args[0]} ${args[1]} ${args[2]}
Primo Secondo Terzo -> echo $@
Numero di argomento passati: 3 -> echo Numero di argomento passati: $#
$
Eseguire comandi shell con bash
#!/bin/bash # uso le backticks " ` ` " per eseguire comandi shell echo `uname -o` # invece senza backticks echo uname -o
Eseguo lo script:
$ ./backticks.sh GNU/Linux uname -o $
Leggere input dell'utente
#!/bin/bash
echo -e "Ciao, digita una parola: \c "
read word
echo "La parola che hai digitato è: $word"
echo -e "Puoi digitare due parole? "
read word1 word2
echo "Questo è il tuo input: \"$word1\" \"$word2\""
echo -e "Stai capendo qualcosa di questo tutorial? "
# il comando read registra ora la risposta nella variabile di default $REPLY
read
echo "Hai detto $REPLY, Sono felice di sentirlo! "
echo -e "Quali sono i tuoi colori preferiti? "
# -a registra gli inout in un array
read -a colours
echo "I miei colori preferiti sono anche ${colours[0]}, ${colours[1]} e ${colours[2]}"
$ ./read.sh Ciao, digita una parola: piemontewireless La parola che hai digitato è: piemontewireless "Puoi digitare due parole? piemonte wireless Questo è il tuo input: "piemonte" "wireless" Stai capendo qualcosa di questo tutorial? NO Hai detto NO, Sono felice di sentirlo! Quali sono i tuoi colori preferiti? verde nero rosso I miei colori preferiti sono anche verde, nero e rosso $
Il comando TRAP
#!/bin/bash
# comando trap: definisco come trap la funzione bashtrap
trap bashtrap INT
# pulisco lo schermo
clear;
# la funzione trap è eseguita quando viene premuto CTRL-C:
bashtrap()
{
echo "Hai digitato CTRL+C !...eseguo la trap !"
}
# loop da 1/10 a 10/10
for a in `seq 1 10`; do
echo "$a/10 per Uscire."
sleep 1;
done
echo "Esco dallo script !!!"
$ ./trap.sh 1/10 per Uscire. 2/10 per Uscire. 3/10 per Uscire. 4/10 per Uscire. Hai digitato CTRL+C !...eseguo la trap ! 5/10 per Uscire. 6/10 per Uscire. 7/10 per Uscire. 8/10 per Uscire. 9/10 per Uscire. 10/10 per Uscire. Esco dallo script !!! $
Dichiarare un semplice array
#!/bin/bash
# Dichiaro un array con 4 elementi
ARRAY=( 'Debian Linux' 'Redhat Linux' Ubuntu Linux )
# prendo il numero di elementi dell'array
ELEMENTS=${#ARRAY[@]}
# stampo ogni elemento dell'array
for ; do
echo ${ARRAY[${i}]}
done
$ ./array.sh Debian Linux Redhat Linux Ubuntu Linux $
Leggere un file in un array
#!/bin/bash
# Dichiaro l'array
declare -a ARRAY
# Apro il file per leggerlo nell'array
exec 10<bash.txt
let count=0
while read LINE <&10; do
ARRAY[$count]=$LINE
done
echo Numero di elementi: ${#ARRAY[@]}
# stampo il contenuto
echo ${ARRAY[@]}
# chiudo il file
exec 10>&-
$ cat > bash.txt Prima riga Ciao Ciao Fine [CTRL-D] $ ./file2array.sh Numero di elementi: 3 Prima riga Ciao Ciao Fine
Condizioni IF/ELSE
Nota gli spazi dentro le parentesi [ ]. Senza non funziona !!!
#!/bin/bash directory="./BashScripting" # controllo se la directory esiste if [ -d $directory ]; then echo "la directory esiste" else echo "la directory non esiste" fi
$ ./if_es.sh la directory non esiste $ mkdir ./BashScripting $ ./if_es.sh la directory esiste
Condizioni IF/ELSE annidate
#!/bin/bash
choice=4
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "Scegli una parola [1,2 or 3]? "
# Cicla finchè la variabile choice è uguale a 4
while [ $choice -eq 4 ]; do
read choice
# if/else annidati
if [ $choice -eq 1 ] ; then
echo "Hai scelto la parola: Bash"
else
if [ $choice -eq 2 ] ; then
echo "Hai scelto la parola: Scripting"
else
if [ $choice -eq 3 ] ; then
echo "Hai scelto la parola: Tutorial"
else
echo "Fai una scelta tra 1-3 !"
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "Scegli una parola [1,2 or 3]? "
choice=4
fi
fi
fi
done
$ ./nested_if.sh 1. Bash 2. Scripting 3. Tutorial Scegli una parola [1,2 or 3]? 5 Fai una scelta tra 1-3 ! 1. Bash 2. Scripting 3. Tutorial Scegli una parola [1,2 or 3]? 3 Hai scelto la parola: Tutorial $
Riferimenti:
- Bash scripting Tutorial
- bash Cookbook: Solutions and Examples for bash Users
- Classic Shell Scripting
- Learning the bash Shell: Unix Shell Programming

