Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Shell Scripting Tutorial di Derek Banas - http://www.newthinktank.com/2016/06/shell-scripting-tutorial/
- Traduzione / Adattamento in Italiano a cura di Matteo Collica (collicamatteo@gmail.com) - v28/02/2020
- I. Introduzione
- 1. Uno script di shell contiene comandi che vengono eseguiti come se fossero stati scritti su terminale.
- 2. Useremo Vim per scrivere i codici di questo tutorial
- a. Installare Vim : sudo apt-get install vim
- b. Comandi di Vim da ricordare
- 1. i : modalità di inserimento
- 2. <ESC> : entra in modalità comandi
- i. w : Salva / Non uscire
- ii. wq : Salva / Esci
- iii. q! : Esci / Scarta le modifiche
- iv. w : Sposta di fronte la parola successiva
- v. b : Sposta di fronte la parola precedente
- vi. 0 : Sposta all''inizio della linea
- vii. $ : Sposta alla fine della line
- viii. G : Salta all''ultima linea
- 3. Spostati attorno con le frecce direzionali
- 4. :set number : Mostra i numeri di riga
- 5. :syntax on : Evidenziazione della sintassi (Syntax Highlighting)
- 6. :set tabstop=2 : Numero di Spazi per Tab
- 7. :set autoindent : Indenta le nuove linee
- 8. Salva queste opzioni nel file ~/.vimrc della tua cartella home
- a. Scopri quale file vimrc è in uso con questo comando in Vim :echo $MYVIMRC
- 3. Script Hello World
- # Il simbolo #! (shebang) specifica al sistema quale interprete usare per lo script
- #!/bin/bash
- # Commento
- echo 'Hello World' # Stampa la stringa a schermo
- a. Per renderlo eseguibile chmod 755 hello_world
- b. Esegui con ./hello_world
- c. I numeri dopo chmod definiscono chi può fare cosa con il file
- d. I numeri rappresentano il Proprietario, il Gruppo e Chiunque altro
- e. Cosa i numeri rappresentano
- 1. 7 : Lettura, Scrittura & Esecuzione
- 2. 6 : Lettura & Scrittura
- 3. 5 : Lettura & Esecuzione
- 4. 4 : Sola Lettura
- 5. 3 : Scrittura & Esecuzione
- 6. 2 : Sola Scrittura
- 7. 1 : Sola Esecuzione
- 8. 0 : Nulla
- 4. Definiamo variabili in questo modo mioNome="Derek"
- a. Il nome di una variabile inizia con una lettera o _ e può contenere anche numeri
- b. La shell considera tutte le variabili come stringhe
- c. Quando si dichiara una variabile non vanno inseriti spazi bianchi ai lati del =
- d.
- #!/bin/bash
- declare -r NUM1=5 # Dichiarare una costante
- num2=4
- # Usare l'espansione aritmetica per calcolare
- num3=$((NUM1+num2))
- num4=$((NUM1-num2))
- num5=$((NUM1*num2))
- num6=$((NUM1/num2))
- # Inserire variabili nelle stringhe con $
- echo "5 + 4 = $num3"
- echo "5 - 4 = $num4"
- echo "5 * 4 = $num5"
- echo "5 / 4 = $num6"
- echo $(( 5**2 ))
- echo $(( 5%4 ))
- # Gli operatori di assegnazione consentono l'aritmetica abbreviata
- # +=, -=, *=, /=
- rand=5
- let rand+=4
- echo "$rand"
- # Incremento e decremento abbreviati
- echo "rand++ = $(( rand++ ))"
- echo "++rand = $(( ++rand ))"
- echo "rand-- = $(( rand-- ))"
- echo "--rand = $(( --rand ))"
- # Usare Python per addizionare numeri reali
- num7=1.2
- num8=3.4
- num9=$(python -c "print $num7+$num8")
- echo $num9
- # È possibile stampare su più linee in questo modo:
- # (cat stampa un file o qualsiasi stringa passata ad esso)
- cat << TESTO
- Questo testo
- verrà stampato
- su più linee
- TESTO
- II. Funzioni
- 1. Possiamo usare le funzioni per evitare di dover scrivere più volte lo stesso codice
- 2. Cancella tutto il codice precedentemente scritto con gg e poi dG
- 3. #!/bin/bash
- # Definire la funzione
- getDate() {
- # Ottenere la data e l'orario attuali
- date
- # Return ritorna uno stato di uscita tra 0 - 255
- return
- }
- getDate
- # Di seguito una variabile globale
- nome="Derek"
- # I valori delle variabili locali non sono disponibili fuori dalla funzione
- demLocal() {
- local nome="Paolo"
- return
- }
- demLocal
- echo "$nome"
- # Una funzione che riceve 2 valori e ne stampa la somma
- getSum() {
- # Gli attributi vengono richiamati riferendosi a $1, $2, ecc.
- local num3=$1
- local num4=$2
- # Somma dei valori
- local sum=$((num3+num4))
- # Ritorna i valori con echo
- echo $sum
- }
- num1=5
- num2=6
- # Per passare gli attributi vanno separati da uno spazio
- # Racchiudi la funzione dentro $() per ottenere il valore di ritorno
- sum=$(getSum num1 num2)
- echo "La somma è $sum"
- III. Condizionali / Input
- 1.
- #!/bin/bash
- # Possiamo usare read per ricevere input da memorizzare in nome
- # L'opzione p dice che vogliamo richiedere (prompt) una stringa
- read -p "Come ti chiami? " nome
- echo "Ciao $nome"
- read -p "Quanti anni hai? " anni
- # Racchiudere le condizioni tra []
- # Includere uno spazio dopo [ e prima di ]
- # Confronto tra interi: eq, ne, le, lt, ge, gt
- if [ $anni -ge 18 ]
- then
- echo "Puoi guidare"
- # Controlla un'altra condizione
- elif [ $anni -eq 18 ]
- then
- echo "Potrai guidare l'anno prossimo"
- # Eseguito per impostazione predefinita
- else
- echo "Non puoi guidare"
- # Chiude l'istruzione if
- fi
- 2. Test esteso su interi
- #!/bin/bash
- read -p "Inserisci un numero : " num
- if ((num == 10)); then
- echo "Il numero inserito equivale a 10"
- fi
- if ((num > 10)); then
- echo "È maggiore di 10"
- else
- echo "È minore di 10"
- fi
- if (( ((num % 2)) == 0 )); then
- echo " È un numero pari"
- fi
- # Si possono usare operatori logici come &&, || e !
- if (( ((num > 0)) && ((num < 11)) )); then
- echo "$num è compreso tra 1 e 10"
- fi
- # && e || possono essere usate come strutture di controllo
- # Crea un file e poi se ha funzionato aprilo in Vim
- touch esempio_file && vim esempio_file
- # Se esempio_dir non esiste creala
- [ -d esempio_dir ] || mkdir esempio_dir
- # Per eliminare il file: rm esempio_file
- # Per eliminare la directory: rmdir esempio_dir
- 3. Test su stringhe
- #!/bin/bash
- str1=""
- str2="Infelice"
- str3="Felice"
- # Verifica se una stringa è nulla
- if [ "$str1" ]; then
- echo "$str1 non è nulla"
- fi
- if [ -z "$str1" ]; then
- echo "str1 non ha valore"
- fi
- # Verificare l'uguaglianza tra stringhe
- if [ "$str2" == "$str3" ]; then
- echo "$str2 equivale a $str3"
- elif [ "$str2" != "$str3" ]; then
- echo "$str2 non equivale a $str3"
- fi
- if [ "$str2" > "$str3" ]; then
- echo "$str2 succede $str3"
- elif [ "$str2" < "$str3" ]; then
- echo "$str2 precede $str3"
- fi
- # Controlli sui file test_file1 e test_file2
- file1="./test_file1"
- file2="./test_file2"
- if [ -e "$file1" ]; then
- echo "$file1 esiste"
- if [ -f "$file1" ]; then
- echo "$file1 è un file normale"
- fi
- if [ -r "$file1" ]; then
- echo "$file1 è leggibile"
- fi
- if [ -w "$file1" ]; then
- echo "$file1 è scrivibile"
- fi
- if [ -x "$file1" ]; then
- echo "$file1 è eseguibile"
- fi
- if [ -d "$file1" ]; then
- echo "$file1 è una directory"
- fi
- if [ -L "$file1" ]; then
- echo "$file1 è un collegamento simbolico"
- fi
- if [ -p "$file1" ]; then
- echo "$file1 è una named pipe"
- fi
- if [ -S "$file1" ]; then
- echo "$file1 è un socket di rete"
- fi
- if [ -G "$file1" ]; then
- echo "$file1 appartiene al gruppo"
- fi
- if [ -O "$file1" ]; then
- echo "$file1 è di proprietà dell'ID utente"
- fi
- fi
- 4. Con il test esteso [[ ]] puoi adoperare Espressioni Regolari
- #!/bin/bash
- read -p "Data da convalidare : " data
- pattern="^[0-9]{8}$"
- if [[ $data =~ $pattern ]]; then
- echo "$data valida"
- else
- echo "$data non valida"
- fi
- 5. # Lettura (in input) di più valori
- #!/bin/bash
- read -p "Inserisci 2 numeri da sommare : " num1 num2
- sum=$((num1+num2))
- echo "$num1 + $num2 = $sum"
- # Nascondi l'input con l'opzione -s
- read -sp "Inserisci il codice segreto : " segreto
- if [ "$segreto" == "password" ]; then
- echo "Inserito"
- else
- echo "Password Errata"
- fi
- 6. È possibile impostare cosa separa i valori con IFS
- #!/bin/bash
- # Memorizzare il valore originale di IFS
- OIFS="$IFS"
- # Impostare cosa separa i valori in input
- IFS=","
- read -p "Inserisci 2 numeri da addizionare, separati da una virgola : " num1 num2
- # Usare l'espansione di parametro ${} per sostituire ogni spazio bianco
- # con il nulla
- num1=${num1//[[:blank:]]/}
- num2=${num2//[[:blank:]]/}
- sum=$((num1+num2))
- echo "$num1 + $num2 = $sum"
- # Ripristinare IFS al suo valore originale
- IFS="$OIFS"
- # Espansione dei parametri, caso d'uso necessario:
- piazzamento="1"
- echo "${piazzamento}° posizione"
- # Funzione cerca e sostituisci:
- samp_string="Il cane si arrampicò sull'albero"
- echo "${samp_string//cane/gatto}"
- # Si può utilizzare un valore predefinito se inesistente
- echo "Mi chiamo ${nome:-Derek}"
- # O utilizzare e assegnare un valore predefinito
- # alla variabile se inesistente
- echo "Mi chiamo ${nome:=Derek}"
- echo $nome
- 7. Utilizzare case quando ha più senso di if
- #!/bin/bash
- read -p "Quanti anni hai : " anni
- # Controlla il valore di anni
- case $anni in
- # Se è compreso tra 0 e 4
- [0-4])
- echo "Troppo giovane per la scuola"
- ;; # Smetti di controllare oltre
- # Se corrisponde a 5
- 5)
- echo "Vai all'asilo"
- ;;
- # Se è compreso tra 6 e 18
- [6-9]|1[0-8])
- grado=$((anni-5))
- echo "Frequenta la classe di ${grado}° grado"
- ;;
- # Azione predefinita
- *)
- echo "Sei troppo anziano per la scuola"
- ;;
- esac # Fine case
- 8. L''Operatore Ternario ? esegue diverse azioni in base a una condizione
- #!/bin/bash
- puo_votare=0
- anni=18
- ((anni>=18?(puo_votare=1):(puo_votare=0)))
- echo "Può votare : $puo_votare"
- IV. Espansione dei Parametri e Stringhe
- 1. Stringhe
- #!/bin/bash
- rand_str="Una stringa casuale"
- # Ottenere la lunghezza della stringa
- echo "Lunghezza Stringa : ${#rand_str}"
- # Solo i caratteri della stringa che vanno da un indice in poi
- echo "${rand_str:4}"
- # Solo i caratteri della stringa compresi tra un indice iniziale e uno finale
- echo "${rand_str:4:7}"
- # Ritorna i caratteri dopo "Una"
- echo "${rand_str#*Una }"
- V. Cicli
- 1. Ciclo While
- #!/bin/bash
- num=1
- while [ $num -le 10 ]; do
- echo $num
- num=$((num + 1))
- done
- 2. Continue e Break
- #!/bin/bash
- num=1
- while [ $num -le 20 ]; do
- # Non stampare numeri pari
- if (( ((num % 2)) == 0 )); then
- num=$((num + 1))
- continue
- fi
- # Esci fuori dal ciclo con break
- if ((num >= 15)); then
- break
- fi
- echo $num
- num=$((num + 1))
- done
- 3. Until si ripete finché la condizione non è true
- #!/bin/bash
- num=1
- until [ $num -gt 10 ]; do
- echo $num
- num=$((num + 1))
- done
- 4. Usare read e un ciclo per generare informazioni sui file
- #!/bin/bash
- while read presenze reti assist; do
- # printf permette di usare \n
- printf "Presenze: ${presenze}\nReti: ${reti}\nAssist: ${assist}\n"
- # Pipe dati nel ciclo while
- done < lionel_messi.txt
- 5. Ci sono molte opzioni per il ciclo for. Un esempio che ricorda il C:
- #!/bin/bash
- for (( i=0; i <= 10; i=i+1 )); do
- echo $i
- done
- 6. Si può scorrere i valori tra intervalli
- #!/bin/bash
- for i in {A..Z}; do
- echo $i
- done
- 7.
- VI. Vettori
- 1. I vettori Bash possono avere solo una dimensione e gli indici iniziano da 0
- 2. Operazioni sui vettori
- #!/bin/bash
- # Definire un vettore
- num_spec=(3.14 2.718 .57721 4.6692)
- echo "Pi : ${num_spec[0]}"
- # Aggiungere valori al vettore
- num_spec[4]=1.618
- echo "Numero aureo : ${num_spec[4]}"
- # Aggiungere gruppi di valori al vettore
- num_spec+=(1 7)
- # Visualizzare tutti i valori del vettore
- for i in ${num_spec[*]}; do
- echo $i;
- done
- # Visualizzazione indici
- for i in ${!num_spec[@]}; do
- echo $i;
- done
- # Ottenere il numero di elementi nel vettore
- echo "Lunghezza Vettore : ${#num_spec[@]}"
- # Ottenere la lunghezza di un elemento del vettore
- echo "Lunghezza Elemento di indice 3 : ${#num_spec[3]}"
- # Ordinare un vettore
- num_ordinati=($(for i in "${num_spec[@]}"; do
- echo $i;
- done | sort))
- for i in ${num_ordinati[*]}; do
- echo $i;
- done
- # Eliminare un elemento da un vettore
- unset 'num_ordinati[1]'
- # Eliminare un vettore
- unset num_ordinati
- VII. Parametri Posizionali
- 1. Gli argomenti con cui viene richiamato uno script vengono memorizzati nei nomi delle variabili compresi tra 1 e il numero di parametri
- a. $0 contiene sempre il percorso dello script eseguito
- b. Puoi accedere ai nomi dopo 9 con l''espansione dei parametri, ad esempio: ${10}
- 2. Somma dei numeri specificati su riga di comando
- #!/bin/bash
- # Visualizzare il primo argomento
- echo "1° Argomento : $1"
- sum=0
- # $# esprime il numero di argomenti
- while [[ $# -gt 0 ]]; do
- # Ottenere il primo argomento
- num=$1
- sum=$((sum + num))
- # shift sposta il valore di $2 in $1 finché ce ne sono
- # Il valore di $# diminuisce pure
- shift
- done
- echo "Somma : $sum"
Advertisement
Add Comment
Please, Sign In to add comment