MatteoCollica

Shell Scripting Tutorial IT

Feb 28th, 2020
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 13.07 KB | None | 0 0
  1. Shell Scripting Tutorial di Derek Banas - http://www.newthinktank.com/2016/06/shell-scripting-tutorial/
  2. Traduzione / Adattamento in Italiano a cura di Matteo Collica (collicamatteo@gmail.com) - v28/02/2020
  3.  
  4. I. Introduzione
  5.  
  6. 1. Uno script di shell contiene comandi che vengono eseguiti come se fossero stati scritti su terminale.
  7.  
  8. 2. Useremo Vim per scrivere i codici di questo tutorial
  9.  
  10.     a. Installare Vim : sudo apt-get install vim
  11.    
  12.     b. Comandi di Vim da ricordare
  13.    
  14.         1. i : modalità di inserimento
  15.  
  16.         2. <ESC> : entra in modalità comandi
  17.             i. w : Salva / Non uscire
  18.             ii. wq : Salva / Esci
  19.             iii. q! : Esci / Scarta le modifiche
  20.             iv. w : Sposta di fronte la parola successiva
  21.             v. b : Sposta di fronte la parola precedente
  22.             vi. 0 : Sposta all''inizio della linea
  23.             vii. $ : Sposta alla fine della line
  24.             viii. G : Salta all''ultima linea
  25.        
  26.         3. Spostati attorno con le frecce direzionali
  27.        
  28.         4. :set number : Mostra i numeri di riga
  29.        
  30.         5. :syntax on : Evidenziazione della sintassi (Syntax Highlighting)
  31.        
  32.         6. :set tabstop=2 : Numero di Spazi per Tab
  33.        
  34.         7. :set autoindent : Indenta le nuove linee
  35.        
  36.         8. Salva queste opzioni nel file ~/.vimrc della tua cartella home
  37.        
  38.             a. Scopri quale file vimrc è in uso con questo comando in Vim :echo $MYVIMRC
  39.  
  40. 3. Script Hello World
  41. # Il simbolo #! (shebang) specifica al sistema quale interprete usare per lo script
  42. #!/bin/bash
  43. # Commento
  44. echo 'Hello World' # Stampa la stringa a schermo
  45.  
  46.     a. Per renderlo eseguibile chmod 755 hello_world
  47.    
  48.     b. Esegui con ./hello_world
  49.    
  50.     c. I numeri dopo chmod definiscono chi può fare cosa con il file
  51.    
  52.     d. I numeri rappresentano il Proprietario, il Gruppo e Chiunque altro
  53.    
  54.     e. Cosa i numeri rappresentano
  55.    
  56.         1. 7 : Lettura, Scrittura & Esecuzione
  57.         2. 6 : Lettura & Scrittura
  58.         3. 5 : Lettura & Esecuzione
  59.         4. 4 : Sola Lettura
  60.         5. 3 : Scrittura & Esecuzione
  61.         6. 2 : Sola Scrittura
  62.         7. 1 : Sola Esecuzione
  63.         8. 0 : Nulla
  64.        
  65. 4. Definiamo variabili in questo modo mioNome="Derek"
  66.  
  67.     a. Il nome di una variabile inizia con una lettera o _ e può contenere anche numeri
  68.    
  69.     b. La shell considera tutte le variabili come stringhe
  70.    
  71.     c. Quando si dichiara una variabile non vanno inseriti spazi bianchi ai lati del =
  72.    
  73.     d.
  74.     #!/bin/bash
  75.     declare -r NUM1=5 # Dichiarare una costante
  76.     num2=4
  77.    
  78.     # Usare l'espansione aritmetica per calcolare
  79.     num3=$((NUM1+num2))
  80.     num4=$((NUM1-num2))
  81.     num5=$((NUM1*num2))
  82.     num6=$((NUM1/num2))
  83.    
  84.     # Inserire variabili nelle stringhe con $
  85.     echo "5 + 4 = $num3"
  86.     echo "5 - 4 = $num4"
  87.     echo "5 * 4 = $num5"
  88.     echo "5 / 4 = $num6"
  89.     echo $(( 5**2 ))
  90.     echo $(( 5%4 ))
  91.    
  92.     # Gli operatori di assegnazione consentono l'aritmetica abbreviata
  93.     # +=, -=, *=, /=
  94.     rand=5
  95.     let rand+=4
  96.     echo "$rand"
  97.    
  98.     # Incremento e decremento abbreviati
  99.     echo "rand++ = $(( rand++ ))"
  100.     echo "++rand = $(( ++rand ))"
  101.     echo "rand-- = $(( rand-- ))"
  102.     echo "--rand = $(( --rand ))"
  103.    
  104.     # Usare Python per addizionare numeri reali
  105.     num7=1.2
  106.     num8=3.4
  107.     num9=$(python -c "print $num7+$num8")
  108.     echo $num9
  109.    
  110.     # È possibile stampare su più linee in questo modo:
  111.     # (cat stampa un file o qualsiasi stringa passata ad esso)
  112.     cat << TESTO
  113.     Questo testo
  114.     verrà stampato
  115.     su più linee
  116.     TESTO
  117.  
  118.  II. Funzioni
  119.  
  120.     1. Possiamo usare le funzioni per evitare di dover scrivere più volte lo stesso codice
  121.    
  122.     2. Cancella tutto il codice precedentemente scritto con gg e poi dG
  123.    
  124.     3. #!/bin/bash
  125.     # Definire la funzione
  126.     getDate() {
  127.        
  128.         # Ottenere la data e l'orario attuali
  129.         date
  130.        
  131.         # Return ritorna uno stato di uscita tra 0 - 255
  132.         return
  133.     }
  134.    
  135.     getDate
  136.    
  137.     # Di seguito una variabile globale
  138.     nome="Derek"
  139.    
  140.     # I valori delle variabili locali non sono disponibili fuori dalla funzione
  141.     demLocal() {
  142.         local nome="Paolo"
  143.         return
  144.     }
  145.    
  146.     demLocal
  147.    
  148.     echo "$nome"
  149.    
  150.     # Una funzione che riceve 2 valori e ne stampa la somma
  151.     getSum() {
  152.    
  153.         # Gli attributi vengono richiamati riferendosi a $1, $2, ecc.
  154.         local num3=$1
  155.         local num4=$2
  156.        
  157.         # Somma dei valori
  158.         local sum=$((num3+num4))
  159.        
  160.         # Ritorna i valori con echo
  161.         echo $sum
  162.     }
  163.    
  164.     num1=5
  165.     num2=6
  166.    
  167.     # Per passare gli attributi vanno separati da uno spazio
  168.     # Racchiudi la funzione dentro $() per ottenere il valore di ritorno
  169.     sum=$(getSum num1 num2)
  170.     echo "La somma è $sum"
  171.    
  172. III. Condizionali / Input
  173.  
  174.     1.
  175.     #!/bin/bash
  176.    
  177.     # Possiamo usare read per ricevere input da memorizzare in nome
  178.     # L'opzione p dice che vogliamo richiedere (prompt) una stringa
  179.     read -p "Come ti chiami? " nome
  180.     echo "Ciao $nome"
  181.  
  182.     read -p "Quanti anni hai? " anni
  183.      
  184.     # Racchiudere le condizioni tra []
  185.     # Includere uno spazio dopo [ e prima di ]
  186.     # Confronto tra interi: eq, ne, le, lt, ge, gt
  187.     if [ $anni -ge 18 ]
  188.     then
  189.         echo "Puoi guidare"
  190.    
  191.     # Controlla un'altra condizione
  192.     elif [ $anni -eq 18 ]
  193.     then
  194.         echo "Potrai guidare l'anno prossimo"
  195.        
  196.     # Eseguito per impostazione predefinita
  197.     else
  198.       echo "Non puoi guidare"
  199.      
  200.     # Chiude l'istruzione if
  201.     fi
  202.    
  203.     2. Test esteso su interi
  204.     #!/bin/bash
  205.    
  206.     read -p "Inserisci un numero : " num
  207.    
  208.     if ((num == 10)); then
  209.         echo "Il numero inserito equivale a 10"
  210.     fi
  211.    
  212.     if ((num > 10)); then
  213.         echo "È maggiore di 10"
  214.     else
  215.         echo "È minore di 10"
  216.     fi
  217.    
  218.     if (( ((num % 2)) == 0 )); then
  219.         echo " È un numero pari"
  220.     fi
  221.    
  222.     # Si possono usare operatori logici come &&, || e !
  223.     if (( ((num > 0)) && ((num < 11)) )); then
  224.         echo "$num è compreso tra 1 e 10"
  225.     fi
  226.    
  227.     # && e || possono essere usate come strutture di controllo
  228.    
  229.     # Crea un file e poi se ha funzionato aprilo in Vim
  230.     touch esempio_file && vim esempio_file
  231.    
  232.     # Se esempio_dir non esiste creala
  233.     [ -d esempio_dir ] || mkdir esempio_dir
  234.    
  235.     # Per eliminare il file: rm esempio_file
  236.     # Per eliminare la directory: rmdir esempio_dir
  237.  
  238.     3. Test su stringhe
  239.     #!/bin/bash
  240.     str1=""
  241.     str2="Infelice"
  242.     str3="Felice"
  243.    
  244.     # Verifica se una stringa è nulla
  245.     if [ "$str1" ]; then
  246.         echo "$str1 non è nulla"
  247.     fi
  248.    
  249.     if [ -z "$str1" ]; then
  250.         echo "str1 non ha valore"
  251.     fi
  252.    
  253.     # Verificare l'uguaglianza tra stringhe
  254.     if [ "$str2" == "$str3" ]; then
  255.         echo "$str2 equivale a $str3"
  256.     elif [ "$str2" != "$str3" ]; then
  257.         echo "$str2 non equivale a $str3"
  258.     fi
  259.    
  260.     if [ "$str2" > "$str3" ]; then
  261.         echo "$str2 succede $str3"
  262.     elif [ "$str2" < "$str3" ]; then
  263.         echo "$str2 precede $str3"
  264.     fi
  265.    
  266.     # Controlli sui file test_file1 e test_file2
  267.     file1="./test_file1"
  268.     file2="./test_file2"
  269.    
  270.     if [ -e "$file1" ]; then
  271.         echo "$file1 esiste"
  272.        
  273.         if [ -f "$file1" ]; then
  274.             echo "$file1 è un file normale"
  275.         fi
  276.        
  277.         if [ -r "$file1" ]; then
  278.             echo "$file1 è leggibile"
  279.         fi
  280.        
  281.         if [ -w "$file1" ]; then
  282.             echo "$file1 è scrivibile"
  283.         fi
  284.        
  285.         if [ -x "$file1" ]; then
  286.             echo "$file1 è eseguibile"
  287.         fi
  288.        
  289.         if [ -d "$file1" ]; then
  290.             echo "$file1 è una directory"
  291.         fi
  292.        
  293.         if [ -L "$file1" ]; then
  294.             echo "$file1 è un collegamento simbolico"
  295.         fi
  296.        
  297.         if [ -p "$file1" ]; then
  298.             echo "$file1 è una named pipe"
  299.         fi
  300.        
  301.         if [ -S "$file1" ]; then
  302.             echo "$file1 è un socket di rete"
  303.         fi
  304.        
  305.         if [ -G "$file1" ]; then
  306.             echo "$file1 appartiene al gruppo"
  307.         fi
  308.        
  309.         if [ -O "$file1" ]; then
  310.             echo "$file1 è di proprietà dell'ID utente"
  311.         fi
  312.        
  313.     fi
  314.    
  315.     4. Con il test esteso [[ ]] puoi adoperare Espressioni Regolari
  316.     #!/bin/bash
  317.    
  318.     read -p "Data da convalidare : " data
  319.    
  320.     pattern="^[0-9]{8}$"
  321.    
  322.     if [[ $data =~ $pattern ]]; then
  323.         echo "$data valida"
  324.     else
  325.         echo "$data non valida"
  326.     fi
  327.    
  328.     5. # Lettura (in input) di più valori
  329.     #!/bin/bash
  330.    
  331.     read -p "Inserisci 2 numeri da sommare : " num1 num2
  332.    
  333.     sum=$((num1+num2))
  334.    
  335.     echo "$num1 + $num2 = $sum"
  336.    
  337.     # Nascondi l'input con l'opzione -s
  338.     read -sp "Inserisci il codice segreto : " segreto
  339.    
  340.     if [ "$segreto" == "password" ]; then
  341.         echo "Inserito"
  342.     else
  343.         echo "Password Errata"
  344.     fi
  345.    
  346.     6. È possibile impostare cosa separa i valori con IFS
  347.     #!/bin/bash
  348.    
  349.     # Memorizzare il valore originale di IFS
  350.     OIFS="$IFS"
  351.    
  352.     # Impostare cosa separa i valori in input
  353.     IFS=","
  354.    
  355.     read -p "Inserisci 2 numeri da addizionare, separati da una virgola : " num1 num2
  356.    
  357.     # Usare l'espansione di parametro ${} per sostituire ogni spazio bianco
  358.     # con il nulla
  359.     num1=${num1//[[:blank:]]/}
  360.     num2=${num2//[[:blank:]]/}
  361.  
  362.     sum=$((num1+num2))
  363.    
  364.     echo "$num1 + $num2 = $sum"
  365.    
  366.     # Ripristinare IFS al suo valore originale
  367.     IFS="$OIFS"
  368.    
  369.     # Espansione dei parametri, caso d'uso necessario:
  370.     piazzamento="1"
  371.     echo "${piazzamento}° posizione"
  372.    
  373.     # Funzione cerca e sostituisci:
  374.     samp_string="Il cane si arrampicò sull'albero"
  375.     echo "${samp_string//cane/gatto}"
  376.    
  377.     # Si può utilizzare un valore predefinito se inesistente
  378.     echo "Mi chiamo ${nome:-Derek}"
  379.    
  380.     # O utilizzare e assegnare un valore predefinito
  381.     # alla variabile se inesistente
  382.     echo "Mi chiamo ${nome:=Derek}"
  383.     echo $nome
  384.    
  385.     7. Utilizzare case quando ha più senso di if
  386.     #!/bin/bash
  387.    
  388.     read -p "Quanti anni hai : " anni
  389.    
  390.     # Controlla il valore di anni
  391.     case $anni in
  392.    
  393.     # Se è compreso tra 0 e 4
  394.     [0-4])
  395.         echo "Troppo giovane per la scuola"
  396.         ;; # Smetti di controllare oltre
  397.        
  398.     # Se corrisponde a 5
  399.     5)
  400.         echo "Vai all'asilo"
  401.         ;;
  402.        
  403.     # Se è compreso tra 6 e 18
  404.     [6-9]|1[0-8])
  405.         grado=$((anni-5))
  406.         echo "Frequenta la classe di ${grado}° grado"
  407.         ;;
  408.        
  409.     # Azione predefinita
  410.     *)
  411.         echo "Sei troppo anziano per la scuola"
  412.         ;;
  413.     esac # Fine case
  414.    
  415.     8. L''Operatore Ternario ? esegue diverse azioni in base a una condizione
  416.     #!/bin/bash
  417.     puo_votare=0
  418.     anni=18
  419.    
  420.     ((anni>=18?(puo_votare=1):(puo_votare=0)))
  421.     echo "Può votare : $puo_votare"
  422.    
  423.    
  424. IV. Espansione dei Parametri e Stringhe
  425.  
  426.     1. Stringhe
  427.     #!/bin/bash
  428.    
  429.     rand_str="Una stringa casuale"
  430.    
  431.     # Ottenere la lunghezza della stringa
  432.     echo "Lunghezza Stringa : ${#rand_str}"
  433.    
  434.     # Solo i caratteri della stringa che vanno da un indice in poi
  435.     echo "${rand_str:4}"
  436.    
  437.     # Solo i caratteri della stringa compresi tra un indice iniziale e uno finale
  438.     echo "${rand_str:4:7}"
  439.    
  440.     # Ritorna i caratteri dopo "Una"
  441.     echo "${rand_str#*Una }"
  442.  
  443. V. Cicli
  444.  
  445.     1. Ciclo While
  446.     #!/bin/bash
  447.    
  448.     num=1
  449.    
  450.     while [ $num -le 10 ]; do
  451.         echo $num
  452.         num=$((num + 1))
  453.     done
  454.    
  455.     2. Continue e Break
  456.     #!/bin/bash
  457.    
  458.     num=1
  459.    
  460.     while [ $num -le 20 ]; do
  461.    
  462.         # Non stampare numeri pari
  463.         if (( ((num % 2)) == 0 )); then
  464.             num=$((num + 1))
  465.             continue
  466.         fi
  467.        
  468.         # Esci fuori dal ciclo con break
  469.         if ((num >= 15)); then
  470.             break
  471.         fi
  472.        
  473.         echo $num
  474.         num=$((num + 1))
  475.     done
  476.    
  477.     3. Until si ripete finché la condizione non è true
  478.     #!/bin/bash
  479.    
  480.     num=1
  481.    
  482.     until [ $num -gt 10 ]; do
  483.         echo $num
  484.         num=$((num + 1))
  485.     done
  486.    
  487.     4. Usare read e un ciclo per generare informazioni sui file
  488.     #!/bin/bash
  489.     while read presenze reti assist; do
  490.    
  491.         # printf permette di usare \n
  492.         printf "Presenze: ${presenze}\nReti: ${reti}\nAssist: ${assist}\n"
  493.        
  494.     # Pipe dati nel ciclo while
  495.     done < lionel_messi.txt
  496.    
  497.     5. Ci sono molte opzioni per il ciclo for. Un esempio che ricorda il C:
  498.     #!/bin/bash
  499.     for (( i=0; i <= 10; i=i+1 )); do
  500.         echo $i
  501.     done
  502.    
  503.     6. Si può scorrere i valori tra intervalli
  504.     #!/bin/bash
  505.     for i in {A..Z}; do
  506.         echo $i
  507.     done
  508.    
  509.     7.
  510.    
  511. VI. Vettori
  512.  
  513.     1. I vettori Bash possono avere solo una dimensione e gli indici iniziano da 0
  514.    
  515.     2. Operazioni sui vettori
  516.     #!/bin/bash
  517.    
  518.     # Definire un vettore
  519.     num_spec=(3.14 2.718 .57721 4.6692)
  520.    
  521.     echo "Pi : ${num_spec[0]}"
  522.    
  523.     # Aggiungere valori al vettore
  524.     num_spec[4]=1.618
  525.    
  526.     echo "Numero aureo : ${num_spec[4]}"
  527.    
  528.     # Aggiungere gruppi di valori al vettore
  529.     num_spec+=(1 7)
  530.    
  531.     # Visualizzare tutti i valori del vettore
  532.     for i in ${num_spec[*]}; do
  533.         echo $i;
  534.     done
  535.    
  536.     # Visualizzazione indici
  537.     for i in ${!num_spec[@]}; do
  538.         echo $i;
  539.     done
  540.    
  541.     # Ottenere il numero di elementi nel vettore
  542.     echo "Lunghezza Vettore : ${#num_spec[@]}"
  543.    
  544.     # Ottenere la lunghezza di un elemento del vettore
  545.     echo "Lunghezza Elemento di indice 3 : ${#num_spec[3]}"
  546.    
  547.     # Ordinare un vettore
  548.     num_ordinati=($(for i in "${num_spec[@]}"; do
  549.         echo $i;
  550.     done | sort))
  551.    
  552.     for i in ${num_ordinati[*]}; do
  553.         echo $i;
  554.     done
  555.    
  556.     # Eliminare un elemento da un vettore
  557.     unset 'num_ordinati[1]'
  558.    
  559.     # Eliminare un vettore
  560.     unset num_ordinati
  561.  
  562.    
  563. VII. Parametri Posizionali
  564.  
  565.     1. Gli argomenti con cui viene richiamato uno script vengono memorizzati nei nomi delle variabili compresi tra 1 e il numero di parametri
  566.    
  567.         a. $0 contiene sempre il percorso dello script eseguito
  568.        
  569.         b. Puoi accedere ai nomi dopo 9 con l''espansione dei parametri, ad esempio: ${10}
  570.        
  571.     2. Somma dei numeri specificati su riga di comando
  572.     #!/bin/bash
  573.    
  574.     # Visualizzare il primo argomento
  575.     echo "1° Argomento : $1"
  576.    
  577.     sum=0
  578.    
  579.     # $# esprime il numero di argomenti
  580.     while [[ $# -gt 0 ]]; do
  581.    
  582.         # Ottenere il primo argomento
  583.         num=$1
  584.         sum=$((sum + num))
  585.        
  586.         # shift sposta il valore di $2 in $1 finché ce ne sono
  587.         # Il valore di $# diminuisce pure
  588.         shift
  589.     done
  590.    
  591.     echo "Somma : $sum"
Advertisement
Add Comment
Please, Sign In to add comment