Bash shell in 30″ 2

Share Button

Variabili di ambiente

PATH – definisce i percorsi dove trovare tutti i programmi eseguibili
HOME – directory dell’utente
MAIL – il file dove vengono archivate le email dell’utente
IFS – contiene la stringa che viene utilizzata come separatore per le linee di comando. Il valore preimpostato e’ uno spazio
PS1 e PS2 – sono rispettivamente il primo e il secondo prompt di bash. I valori preimpostati sono “$” per il primo e “>” per il secondo
USER – il nome della login utente
TERM – indica il terminale utilizzato dall’utente (importante da impostare per alcuni editor testuali, es vi)
SHELL – indica il tipo di shell utilizzata dall’utente
Note:

  • per utilizzare il valore contenuto in una variabile si deve scrivere il simbolo $ davanti al nome della variabile.
    Es.
    echo $USER
    stampa il valore contenuto nella variabile USER
  • l’assegnamento avviene con il nome della variabile, seguito dal simbolo “=” e successivamente dal valore da associare (meglio se fra virgolette).
    Es.
    PATH="/usr/local/bin:$PATH"
    aggiunge alla variabile PATH il percorso /usr/local/bin
  • le modifiche alle variabili d’ambiente possono essere rese persistenti se archiviate nel file $HOME/.bashrc

Regole di base per i file di script

  • iniziare sempre la prima riga con
    #!/bin/bash
    serve ad indicare allo script il percorso assoluto della shell da eseguire
  • una volta creato il file di script occorre dare i permessi di esecuzione
    con
    chmod ugo+x nome_dello_script.sh
    o con (forma compatta)
    chmod
  • aggiungere al nome del file l’estensione .sh, non si tratta di una regola ma di una buona norma per far sapere che si tratta di uno script di shell

Strutture di controllo

il costrutto if
valuta una condizione ed esegue un blocco di comandi
Sintassi:
if la_condizione_è_vera
then
operazioni da eseguire
else
operazioni da eseguire
fi

e’ possibile usare anche una forma piu’ complessa qualora le condizioni sia di piu’ usando questa forma
if la_condizione_è_soddisfatta
then
operazioni da eseguire
elif altra_condizione_soddisfatta
then
operazioni da eseguire
else
operazoni da eseguire
fi

Esempio
if grep "aiuto" testo.txt
then
echo "Ho trovato la parola che stavi cercando"
else
echo "Non ho trovato la parola che stavi cercando"
fi

Il comando grep “aiuto” testo.txt restituisce true se trova la parola aiuto all’interno del file testo.txt

i test

test è una funziona interna della shell.
Il test valuta la condizione posta alla sua destra e restituisce true o false in relazione al risultato.
Esistono diverse tipologie di valutazione.
Qui l’elenco
operatori di confronto
-eq uguale a
-lt minore di
-le minore o uguale a
-gt maggiore di
-ge maggiore o uguale a

operatori sui file
-f nomefile vero (true) se il file esiste
-r nomefile vero (true) se il file esiste ed è leggibile
-w nomefile vero (true) se il file esiste ed è scrivibile
-x nomefile vero (true) se il file esiste ed è eseguibile
-d nomefile vero (true) se si tratta di una directory
-s nomefile vero (true) se il file esiste ed è maggiore di zero

operatori sulle stringhe
-n string vero (true) se la stringa string non è una stringa nulla
-z string vero (true) se la stringa string è nulla
string1 == string2 vero (true) se entrambe le stringhe sono uguali
string1 != string2 vero (true) se entrambe le stringhe sono diverse
string vero (true) se alla stringa string è assegnato un valore non nullo

attraverso questi operatori logici è possibile unire fra di loro piu’ test
-a corrisponde all'operatore AND
-o corrisponde all'operatore OR

Esempi
d=12
if [ $d -eq 25]
then
echo "si"
else
echo "no il valore è $d"
fi

se il valore della variabile d e’ 25 allo scrivi “si“, altrimenti “no” assieme al valore contenuto
if [ $str1 == $str2 ]
then
echo "Le due stringhe sono uguali!"
fi

Se il contenuto della stringa str1 e’ uguale a quello di str2 allora scrivi “Le due stringhe sono uguali”

if [ -n "$str1" -a -n "$str2" ]
then
echo 'sia $str1 che $str2 non sono nulli'
fi

Se la string str1 e la stringa str2 non hanno valore nulli allora stampami il loro valori dichiarando che non sono nulli
Note importanti sull’uso dei test

  • cio’ che viene scritto fra parentesi quadre [ ] deve essere staccato da ciascuna parentesi con uno spazio
  • qualora si confrontino variabili contenenti stringhe si consiglia di scriverle fra virgolette
    es:
    [ "$str1" == "$str2" ]

stuttura di controllo basata su casi case
Sintassi:
case espressione in
valoreatteso1) comandi da eseguire ;;
valoreatteso1) comandi da eseguire ;;
...
esac

I possibili valori ammessi sono fra le parole chiave case e esac. Il doppio punto e virgola ;; e’ utilizzato come terminatore delle istruzioni.
Il costrutto utilizza ) per dividere il valore possibile dalla serie di istruzioni da eseguire.
Esempio
echo "Fa la tua scelta : "
read scelta;
case $scelta in

1) ls -l ;;
2) ps -aux ;;
3) date ;;
4) who ;;
5) exit

esac

In questo esempio viene chiesto l’input di una stringa che viene archiviato nella variabile scelta (read scelta)
Se la stringa contiene uno dei casi proposti (i numeri da 1 a 5), lo script esegue il corrispettivo comando.
Il comando exit esce dall’esecuzione della shell

Cicli di controllo

cicli di controllo while loop
Sintassi:
while la_condizione_è_vera
do
comandi da eseguire
done

Esempi:
while [ $num -gt 100 ]
do
sleep 5
done

fino a che il valore contenuto nella variabile num è minore di 100 fa un attesa di 5 secondi (sleep 5)
cicli di controllo for
Sintassi:
for variabile in lista
do
comandi_da_eseguire
done

Esempi:
for x in 1 2 3 4 5
do
echo "il valore di x è $x";
done

Stampa 5 volte la stringa “il valore di x è … ” mostrando di volta in volta il valore assunto da x (ogni singolo valore della lista preso per volta)

for file in *~
do
rm $file
done

Cerca tutti i file che finisco con “~” (*~) e li cancella uno alla volta (rm $file)

Nota: il comando break interrompe in qualsiasi ciclo (sia while che for)

Ulteriori informazioni utili

  • assegnare l’output di un comando ad una variabile
    Sintassi:
    VARIABILE=$(comando)
    in alternativa
    VARIABILE=comando
    Esempi:
    SOMMA=$(echo 1+1 | bc)
    il valore contenuto in SOMMA sara’ la somma di 1+1 calcolata dal programma bc

    OGGI=date '+%d/%m/%Y'
    Il valore contenuto in OGGI sara’ la data espressa nella forma giorno/mese/anno

  • Variabili speciali

    $1 ... $n - i valori della sequenza dei parametri passati ad uno script si recuperano attraverso la lettura delle variabili (in sequenza) $1, $2 ...
    $* - considera l'elenco di tutti parametri passati allo script
    $0 - nome dello script eseguito
    $# - numero dei parametri passati allo script
    $? - stato di uscita dell'ultimo comando

    Esempio:
    sorgente dello script esempio.sh
    #!/bin/bash
    echo "Mi sono stati passati $# valori"
    if [ "$#" -gt 0 ]
    then
    echo "Il primo valore e' $1"
    fi

    Uso
    ./esempio.sh 100 200
    Output
    Mi sono stati passati 2 valori
    Il primo valore e' 100
  • Gestione input/output
    • aggiungendo il simbolo “>” seguito da un nome di un file a destra di un comando, l’output viene rediretto in un file sovrascrivendolo
    • aggiungendo il simbolo “>>” seguito da un nome di un file a destra di un comando, l’output viene rediretto in un file accodandolo
      Esempi
      echo "Hello" > output.txt
      cat output.txt
      Hello


      echo "World" >> output.txt
      cat output.txt
      Hello
      World
    • <” seguito da un nome di un file a destra di un comando, si passa in input al comando il contenuto del file
      mail nobody@where.no < testo_email.txt
    • inserendo il simbolo “|” fra due comandi si passa l’output di uno come input dell’altro

      ls | more
    • creare un file di testo e il suo relativo contenuto
      cat > nomefile << EOF
      testo da inserire
      EOF

      Nota: nel file si troveranno le stringhe contenute fra le due parole chiave EOF (escluse)
      Puo’ essere usata una qualsiasi parola chiave a patto che venga ripetuta come chiusura

    Sito da cui e’ stato liberamente tradotto e modificato questo post
    http://linuxhelp.blogspot.com/2005/10/10-seconds-guide-to-bash-shell.html

    Altri link interessanti

Share Button

2 thoughts on “Bash shell in 30″

  1. Pingback: Ligio Blog » Bash in 30 minuti…

  2. Reply napo Ago 25,2009 15:32

    Addenda:
    Interessante articolo che si pone le problematiche di debugging degli script bash

    http://aymanh.com/how-debug-bash-scripts

Leave a Reply