CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: gianpassa con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 10 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 34 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 4 su 4
Discussione:

[GUIDA] Principi di Bash scripting

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Androidiani Power User L'avatar di cesco


    Registrato dal
    Sep 2010
    Località
    Bg
    Messaggi
    5,018
    Smartphone
    TYTN2,desire,desireHD, oneX

    Ringraziamenti
    54
    Ringraziato 1,346 volte in 724 Posts
    Predefinito

    [GUIDA] Principi di Bash scripting

    Questa guida e' applicabile anche ad Android in quanto integra diversi binari, accessibili sia tramite script che tramite input diretto da ADB oppure dall'emulatore del terminale sul telefono.
    Questa e' solo una infarinata generale sull'argomento, la sintassi utilizzata e gli statement piu' comuni.
    Questa guida potrebbe esservi utile per automatizzare qualche comando quando usate adb o fastboot e ridurre le digitazioni

    Tutto quello che elenchero' qui di seguito e' applicabile, sia tramite comando diretto nella shell, sia tramite script, ossia un file con estensione .sh che contiene tutti i comandi che la shell dovrà eseguire in modo lineare ( ossia da sinistra a destra, dall'alto al basso eccezion fatta per le funzioni, che vedremo dopo)
    quindi cominciamo:

    impostazione del file:

    la prima riga del nostro script dovrà SEMPRE avere la dicitura seguente:

    codice:
    #!/bin/bash
    oppure
    #!/bin/sh
    questa riga serve per indicare alla shell ( aka terminale) quale delle shell disponibili e quale sintassi andremo ad usare
    le righe seguenti a questa conterranno i comandi, gli statement , ed eventuali commenti.
    Cap 1 : VARIABILI

    le variabili vendono utilizzate per impostare un valore fisso oppure memorizzare l'output di un comando.
    Attenzione pero', se 2 variabili possiedono lo stesso nome, quando verra' eseguita la seconda variabile , verra' sovrascritta la prima, e' quindi opportuno dare nomi diversi alle variabili in modo da non creare confusione ( a meno che non si voglia sovrascrivere il contenuto della variabile precedente ovviamente!)

    Esempi:

    variabile preimpostata:

    codice:
    VAR="ciao"
    variabile determinata dall'output di un comando:

    codice:
    VAR=`echo "ciao"`
    va sottolineato che le variabili non vengono visualizzate direttamente nell'output della shell ma vanno richiamate!!
    per gli esempi sopra citati e' molto semplice, ed e' ovviamente applicabile a tutti i passi successivi che faremo.
    ecco come:

    codice:
    echo $VAR
    in questo modo noi diremo alla shell di visualizzare nell'output la variabile.

    le variabili possono avere qualsiasi nome vogliate ( VAR, LOL, ASD; ABCD, XYZ) purchè siano seguite dal simbolo "=" e il contenuto della variabile deve essere incluso fra i simboli :
    apostrofo '........'
    virgolette "......."
    accento `.........`
    Arrays:
    sono vettori ( vedi definizione matematica di vettore) oppure matrici ( in caso di array multidimensionali)

    codice:
    declare -a array
    dopo questo comando potremo inserire i singoli valori per la lista come segie:
    codice:
    array[0]="ciao"
    array[1]="si"
    array[2]="no"
    array[3]="boh"
    array[4]="asdlalla"
    una volta dichiarata la lista potremo richiamare i singoli elementi, tutti gli elementi oppure il numero di elementi nella lista nel modo seguente:

    richiama un valore specifico:

    codice:
    echo ${array[3]}
    richiama tutti i valori:

    codice:
    echo ${array[@]}
    visualizza quanti sono i valori nella lista

    codice:
    echo ${#array[@]}
    gli arrays sono utili spesso e volentieri nei loop ( di seguito)
    IF statement:

    questo statement viene utilizzato per eseguire comandi in base a determinate condizioni e la sintassi e la seguente:

    codice:
    if [condizione]; then
    <<<<<esegue alcuni comandi>>>>>
    else
    <<<< esegue altri comandi >>>>>>
    fi
    italianizzando la sintassi avremmo qualcosa del genere:

    codice:
    SE [condizione verificata] ; ALLORA
    <<<< esegue  alcuni comandi >>>>>>
    ALTRIMENTI
    <<<< esegue questi altri comandi >>>>
    fi ( chiusura della condizione )
    per la condizione esistono diverse opzioni e sono ( i piu' usati):

    = a uguale b ( corrisponde anche a ==)
    -e la condizione esiste ( o il file esiste)
    != a diverso da b
    -le "less equal" ossia inferiore o uguale
    -gt "greater than" ossia maggiore di (a maggiore di b )
    -eq a uguale b

    Esempio:

    codice:
    VAR="5"
    if [ $VAR -eq 5 ] ; then
    echo $VAR
    else
    echo " VAR non e' uguale a 5"
    fi
    provate a cambiare il valore di VAR per avere i diversi risultati

    oppure

    codice:
    VAR="10"
    if [ $VAR -le 10 ] ; then
    echo "la variabile e' inferiore o uguale a 10"
    else
    echo "la variabile e' maggiore di 10"
    fi
    oppure

    codice:
    VAR="ciao"
    if [ "$VAR" == "ciao" ] ; then
    echo "uguali"
    else
    echo "diversi"
    fi

    Loop statements:
    i loop sono funzioni che vengono ripetute fino a che la condizione non risulta verificata oppure fino a che l'utente non la interrompe.
    esistono 2 tipi di loop: while e for.

    while loop:

    il loop con while viene utilizzato fino a che una condizione non e' verificata, quindi:

    codice:
    x=1
    while [ $x -le 5 ]
    do
      echo "ciao $x volte"
      x=$(( $x + 1 ))
    done
    il loop continuera' fino a quando "x" non sara' uguale a 5, come? analizziamo la sintassi
    while [ $x -le 5 ]
    do


    traducendo e': MENTRE [$x e' inferiore o uguale a 5] esegui

    echo "ciao $x volte"
    x=$(( $x + 1 ))


    "echo" non fa altro che visualizzare un messaggio
    "x=$(( $x + 1 ))" = si occupa di incrementare "x" di uno ad ogni giro fino a che non sara' uguale a 5

    va sottolineato che all'ultimo giro del loop, ossia quando X sara' uguale a 5, verra' comunque effettuata la somma di 1 a x, quindi x alla fine sara' 6 , ma non verra' visualizzato perche' il loop abbiamo deciso di fermarlo a 5 ( e in qualsiasi caso, se lo fermassimo a 6, x sarebbe 7 e via dicendo)

    la sintassi per le condizioni di while e' la stessa che viene utilizzata per IF ( vedi sopra)

    il loop con while puo' anche essere interrotto da un IF statement, ad esempio:

    codice:
    while [ condizione ]
    do
       statement1      #esegui fino a che la condizione e' vera oppure fino a quando non si arriva alla condizione di break
       statement2
      if [condizione di break]
      then
    	break       	  #esce dal loop
      fi
      statements3          #intanto che la condizione e' vera e non si e' verificata la condizione di break
    done

    For loop:

    il loop con for e' molto simile al loop con while m viene utilizzato, ad esempio per gli array, ed e' molto semplice da capire:

    codice:
    declare -a array
    array[0]="ciao"
    array[1]="si"
    array[2]="no"
    array[3]="boh"
    array[4]="asdlalla"
    
    for i in ${array[@]}
    do
     echo $i
    done
    oppure

    codice:
    for i in 1 2 3 4 5
    do
    echo $i
    done
    in questo caso non leggera' i valori da un array ma leggera' i lavori da noi impostati "1 2 3 4 5" e ad ogni giro visualizzera' il valore letto.

    condizione tripla:

    codice:
    for ((VAR=0; VAR<=10; VAR++))
    do
    echo $VAR
    done
    in questo caso "for" si occupera' di fare la conta da 0 a 10 e poi si fermera' poiche' noi gli abbiamo detto:
    VAR=0, ossia impostiamo VAR a zero inizialmente
    VAR<=10, ossia diciamo a "for" di fermarsi con la conta a 10
    VAR++, ossia diciamo a "for" di incrementare di una unita' VAR ad ogni giro

    Case statement:
    personalmente lo uso per creare script interattivi, quindi, in base all'input lo script esegue uno o una serie di comandi prestabiliti.
    Esempio pratico:

    codice:
    echo "scelte disponibili"
    echo "1 - ciao"
    echo "2 - buona sera"
    echo "3 - buona giornata"
    echo -n "digita un numero [ 1 - 3 ] :  "
    read choice
    case $choice in 
    1)
      echo "hai scelto 1, CIAO"
    ;;
    2)
      echo "hai scelto 2, BUONA SERA"
    ;;
    3)
      echo "hai scelto 3, BUONA GIORNATA"
    esac
    ovviamente potete inserire infinite opzioni , non solo 3
    spiegazione dell'esempio:
    echo -n ---> visualizza un messaggio e attende l'input dell'utente
    read choice ---> legge l'input dell'utente e lo importa in una variabile
    codice:
    case $choice in 
    1)
    ;;
    2)
    ;;
    3)
    esac
    legge la variabile $choice ed esegue il o i comandi elencati nel rispettivo paragrafo
    per ora direi che vi ho infarinato abbastanza ma appena possibile cerchero' di aggiornarla e aggiungere altre spiegazioni!
    ricordatevi sempre che la shell stessa ha una funzione importante, ossia "man".
    Escludendo gli statement e la sintassi, per qualsiasi altro binario, come ad esempio "cat" o "ls" o "sed" , per ottenere informazioni dettagliate sull'utilizzo, vi bastera' digitare

    codice:
    man <binario>
    ad esempio man ls

    divertitevi!
    Ultima modifica di cesco; 14-02-13 alle 13:34
    Follow me on:
    <!-- Place this tag where you want the widget to render. -->
    <div class="g-person" data-width="180" data-href="//plus.google.com/113012341277613226011" data-theme="dark" data-rel="author"></div>

    <!-- Place this tag after the last widget tag. -->
    <script type="text/javascript">
    window.___gcfg = {lang: 'it'};

    (function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
    })();
    </script>
    <br>
    <a class="twitter-timeline" href="https://twitter.com/xcesco89" data-widget-id="398762031488040960">Tweets di @xcesco89</a>
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementB yId(id)){js=d.createElement(s);js.id=id;js.src=p+" ://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}} (document,"script","twitter-wjs");</script>
    Androidiani app
    Estensione Androidiani per Google Chrome

  2. I seguenti 4 Utenti hanno ringraziato cesco per il post:

    iGuich (14-02-13),MrFrancesco961 (04-03-13),N1m0Y (17-11-16)

  3.  
  4. #2
    Androidiani Power User L'avatar di cesco


    Registrato dal
    Sep 2010
    Località
    Bg
    Messaggi
    5,018
    Smartphone
    TYTN2,desire,desireHD, oneX

    Ringraziamenti
    54
    Ringraziato 1,346 volte in 724 Posts
    Predefinito

    Funzioni bash:
    le funzioni permettono di richiamare uno o una serie di comandi successivamente nello script, cambiando il concetto di lettura lineare dello script.
    come funzionano:

    dichiarazione della funzione:

    codice:
    function prova() {
    <<<<statements>>>>>
    }
    in questo modo noi diciamo che "prova" e' la nostra funzione e da quel momento, per richiamarla basterà scrivere prova senza virgolette, senza altri attributi.
    va pero' detto che:

    • la funzione deve essere dichiarata, se possibile all'inizio dello script
    • la funzione anche se definita, se non viene immediatamente richiamata, non viene visualizzata
    • non e' possibile richiamare una funzione prima della dichiarazione della stessa


    esempio pratico:

    codice:
    #!/bin/bash
    function number () {
      echo -n "digita un numero da 0 a 3....."
      echo ""
      read var
      echo ""
      echo ""
      case $var in
    0)
      echo "lol"
      number
    ;;
    1)
      echo "ASD"
      number
    ;;
    2)
      echo "HEI"
      number
    ;;
    3)
      echo "ASDLOL"
    ;;
    *)
      echo "nessun numero valido digitato!! i numeri validi sono da 0 a 3! "
      number
    esac
    }
    number
    spiegazione:
    codice:
    function number () {
    dichiarazione della funzione

    codice:
    echo -n "digita un numero da 0 a 3....."
    "echo -n" visualizza un messaggio e attende l'input dell'utente

    codice:
    read var
    legge e memorizza nella variabile "var" l'input dell'utente

    codice:
    case $var in
    processa la variabile "var" e esegue il comando relativo alla variabile ( 0, 1, 2, 3)

    codice:
    *)
      echo "nessun numero valido digitato!! i numeri validi sono da 0 a 3! "
      number
    nel case statement l'asterisco indica qualsiasi altro valore che non sia esplicitamente dichiarato ( in questo caso che non sia 0, 1, 2 o 3) ed esegue una determinata serie di comandi

    codice:
    0)
      echo "lol"
      number
    in questo caso "number" e' il richiamo della funzione precedentemente dichiarata. quindi, una volta digitato il numero, il case processa la variabile ed esegue i comandi corrispondenti al numero, dopodiché torna alla funzione principale "number"
    come potete vedere la funzione principale puo' essere richiamata dall'interno della stessa, prima ancora che venga chiusa la funzione.

    codice:
    }
    number
    chiusura della funzione con la parentesi graffa e prima chiamata della funzione. La prima chiamata della funzione in questo script e' necessaria subito alla chiusura della stessa, altrimenti nel terminale non verrebbe visualizzato nulla .
    un semplice esempio che integra alcuni degli statements citati sopra:

    codice:
    #!/bin/bash
    function countdown () {
       echo -n "digita i secondi per il countdown:   "
       echo ""
       read X
       while [ $X -gt 0 ]
       do
    		echo " mancano $X secondi!! "
    		X=$(( $X -1 ))
    		sleep 1
    		if [ $X = 0 ] ; then
    					echo "KABOOM!!!!!"
    					countdown
    		fi
       done
    }
    countdown
    Ultima modifica di cesco; 14-02-13 alle 17:40
    Follow me on:
    <!-- Place this tag where you want the widget to render. -->
    <div class="g-person" data-width="180" data-href="//plus.google.com/113012341277613226011" data-theme="dark" data-rel="author"></div>

    <!-- Place this tag after the last widget tag. -->
    <script type="text/javascript">
    window.___gcfg = {lang: 'it'};

    (function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
    })();
    </script>
    <br>
    <a class="twitter-timeline" href="https://twitter.com/xcesco89" data-widget-id="398762031488040960">Tweets di @xcesco89</a>
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementB yId(id)){js=d.createElement(s);js.id=id;js.src=p+" ://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}} (document,"script","twitter-wjs");</script>
    Androidiani app
    Estensione Androidiani per Google Chrome

  5. I seguenti 3 Utenti hanno ringraziato cesco per il post:

    iGuich (14-02-13),N1m0Y (17-11-16)

  6. #3
    Androidiani Power User L'avatar di cesco


    Registrato dal
    Sep 2010
    Località
    Bg
    Messaggi
    5,018
    Smartphone
    TYTN2,desire,desireHD, oneX

    Ringraziamenti
    54
    Ringraziato 1,346 volte in 724 Posts
    Predefinito

    un esempio pratico applicato a fastboot per automatizzare qualche processo
    vanno dette 3 cose:
    1- fastboot deve essere nella stessa cartella dello script oppure deve essere stato configurato nel .bashrc ( vedi guida all'MTP per ubuntu )
    2- dopo aver salvato lo script dovrete prima dargli i permessi di esecuzione quindi
    codice:
    chmod +x script.sh
    3- le righe che iniziano con # sono commenti, quindi saranno visibili nel codice ma non durante l'esecuzione

    ecco il codice :

    codice:
    #!/bin/bash
    #qualche riga vuota
    echo ""
    echo ""
    echo ""
    #funzione menu iniziale
    function menu() {
    echo "++++++++++++++++++++++++++"
    echo "+ digita un numero       +"
    echo "+                        +"
    echo "+ 1 - flash boot.img     +"
    echo "+ 2 - flash recovery.img +"
    echo "+                        +"
    echo "++++++++++++++++++++++++++"
    echo -n ""
    read opt
    #processa la variabile ed esegue
    case $opt in
    	1)
    						#messaggio iniziale e attesa dell'utente
    		echo -n "trascina qui la boot.img che vuoi flashare tramite fastboot poi premi invio"
    		echo ""
    						#lettura dell'input dell'utente e memorizzazione in una variabile
    		read img
    		echo ""
    						#messaggio all'utente
    		echo "riavvia il dispositivo in fastboot mode e premi invio"
    						#attesa dell'input utente
    		read -n 1
    						#procede all'esecuzione del comando
    		echo ""
    		echo ""
    		fastboot flash boot $img
    		echo ""
    		echo ""
    						#una volta terminato torna al menu principale
    		menu
    						#chiusura del "paragrafo"
    	;;
    	2)
    						#messaggio iniziale e attesa dell'utente
    		echo -n "trascina qui la recovery.img che vuoi flashare tramite fastboot poi premi invio"
    		echo ""
    						#lettura dell'input dell'utente e memorizzazione in una variabile
    		read img
    		echo ""
    						#messaggio all'utente
    		echo "riavvia il dispositivo in fastboot mode e premi invio"
    						#attesa dell'input utente
    		read -n 1
    						#procede all'esecuzione del comando
    		echo ""
    		echo ""
    		fastboot flash recovery $img
    		echo ""
    		echo ""
    						#una volta terminato torna al menu principale
    		menu
    	;;
    						#se verra' digitato un numero diverso da [1] o [2] restituira' il seguente messaggio
    	*)
    		clear
    		echo "opzione non valida!! puoi inserire solo [1] o [2] "
    		echo ""
    		echo ""
    		menu
    #chiusura del case statement
    esac
    }
    menu
    Ultima modifica di cesco; 19-02-13 alle 17:24
    Follow me on:
    <!-- Place this tag where you want the widget to render. -->
    <div class="g-person" data-width="180" data-href="//plus.google.com/113012341277613226011" data-theme="dark" data-rel="author"></div>

    <!-- Place this tag after the last widget tag. -->
    <script type="text/javascript">
    window.___gcfg = {lang: 'it'};

    (function() {
    var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
    po.src = 'https://apis.google.com/js/plusone.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
    })();
    </script>
    <br>
    <a class="twitter-timeline" href="https://twitter.com/xcesco89" data-widget-id="398762031488040960">Tweets di @xcesco89</a>
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementB yId(id)){js=d.createElement(s);js.id=id;js.src=p+" ://platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}} (document,"script","twitter-wjs");</script>
    Androidiani app
    Estensione Androidiani per Google Chrome

  7. I seguenti 3 Utenti hanno ringraziato cesco per il post:

    N1m0Y (17-11-16),S_mario (07-11-14)

  8. #4
    Androidiano VIP L'avatar di S_mario


    Registrato dal
    Sep 2011
    Località
    da qualche parte nelle Marche
    Messaggi
    1,103
    Smartphone
    LG Nexus 5

    Ringraziamenti
    563
    Ringraziato 630 volte in 450 Posts
    Predefinito

    sommo cesco.. mi servirebbe uno script bash per uppare i file su mediafire.
    sai dove posso cercare instruzioni?

    --- Nexus 5 16GB ----
    ----- IL TASTO THANKS NON MORDE -----
    Che sia FRITTA o BAGNATA dio benedica la PATATA

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy