Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati
  • Differenze per "andreas-xavier/prova14"
Differenze tra le versioni 12 e 14 (in 2 versioni)
Versione 12 del 14/11/2021 10.33.23
Dimensione: 7764
Commento: Macro PaginaDiProva
Versione 14 del 13/02/2022 16.54.50
Dimensione: 12107
Commento:
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 1: Linea 1:
## page was renamed from LinguaggioBash
#format wiki
Linea 5: Linea 7:
<<Informazioni(forum="http://forum.ubuntu-it.org/viewtopic.php?f=46&t=612971"; rilasci="20.04 18.04 16.04")>>  <<Informazioni(forum="http://forum.ubuntu-it.org/viewtopic.php?f=46&t=620802";)>>
Linea 9: Linea 11:
'''Ubuntu Software''' (noto anche semplicemente come '''Software''') è il gestore di pacchetti predefinito dalla versione '''16.04''' di Ubuntu.<<BR>>
Ha sostituito [[AmministrazioneSistema/InstallareProgrammi/UbuntuSoftwareCenter|Ubuntu Software Center]] (che rimane comunque installabile nella versione 16.04).<<BR>>
'''Ubuntu Software''' è progettato per gestire in maniera semplice e veloce l'installazione e la rimozione dei programmi, gli aggiornamenti del software già installato e le [[Repository|sorgenti software]].

A seconda della versione di Ubuntu, viene fornito da Canonical in due modalità:
 * '''Ubuntu 20.04''': versione customizzata di '''[[https://snapcraft.io/snap-store|Snap Store]]'''. Si trova preinstallato come [[AmministrazioneSistema/InstallareProgrammi/PacchettiSnap|snap]].
 * '''Ubuntu 19.10 e precedenti''': versione customizzata di '''[[https://wiki.gnome.org/Apps/Software|GNOME Software]]'''.

Le due versioni funzionano pressoché allo stesso modo, benché presentino piccolissime differenze.

= Installazione e avvio =

Il programma è preinstallato dalla versione '''16.04''' su Ubuntu e alcune [[http://www.ubuntu-it.org/derivate|derivate ufficiali]].<<BR>>
Se assente, è possibile installarlo tramite le istruzioni descritte di seguito.

== Ubuntu 20.04 ==
Digitare in un [[AmministrazioneSistema/Terminale|terminale]]:{{{
sudo snap install snap-store
}}}

In alternativa, è possibile utilizzare la versione pacchettizzata da [[Repository|repository]] (in `.deb`). A tale scopo consultare le istruzioni per le versioni precedenti, nel seguente paragrafo.

{{{#!wiki tip
È possibile installare entrambe le versioni. Nel menu saranno presenti due voci: '''Ubuntu Software''' (versione `.snap`) e '''Software''' (versione in `.deb`).
}}}

<<Anchor(18.04)>>
== Ubuntu 18.04 ==
A seconda delle proprie necessità, [[AmministrazioneSistema/InstallareProgrammi|installare]]:
 * il pacchetto [[apt://gnome-software|gnome-software]];
 * il pacchetto [[apt://ubuntu-software|ubuntu-software]] (se si desiderano le personalizzazioni di Ubuntu: classica icona arancione, recensioni degli utenti e il software visualizzato come '''Ubuntu Software''').

== Avvio ==

Una volta [[AmbienteGrafico/AvviareProgrammi|avviato]], a seconda della versione in uso, verrà visualizzata una delle seguenti schermate:
<<BR>>

||<style="border:none;"><<Immagine(./software_focal.png,500,)>>||<style="border:none;">Questo è l'aspetto di '''Software''' in Ubuntu 20.04. ||

||<style="border:none;"><<Immagine(./software18.04.png,500,)>>||<style="border:none;">Questo è l'aspetto di '''Ubuntu Software''' in Ubuntu 18.04. ||

= Descrizione interfaccia =

== Sezioni principali ==

L'interfaccia è molto semplice ed è suddivisa in tre sezioni principali, selezionabili sulla barra di navigazione superiore del programma. Qui di seguito ne vengono elencate le caratteristiche principali:

<<Anchor(tutto)>>
 * '''Esplora (20.04)/Tutto (versioni precedenti)''': in questa sezione viene mostrato tutto il software disponibile per Ubuntu. Sono presenti le seguenti sottosezioni:
  * '''Categorie''': mostra la suddivisione in aree tematiche (Audio e video, Giochi ecc..).
  * '''Selezionate da noi''': mostra una selezione di software consigliati.
  * '''Rilasci recenti''' (da Ubuntu 18.04): mostra le ultime applicazioni aggiunte ad '''Ubuntu Software''' disponibili per l'installazione.
  * '''Applicazioni consigliate (19.10 e precedenti)''': mostra di volta in volta una selezione di software consigliati relativi a una delle categorie (giochi, grafica, ecc..).
 * '''Installato''': presenta in ordine alfabetico i software installati.
 * '''Aggiornamenti''': segnala l'eventuale presenza di aggiornamenti per i software installati.

<<Anchor(ricerca)>>
== Funzione di ricerca ==

Nella schermata '''[[#tutto|Tutto]]''' è possibile ricercare le applicazioni che si desidera installare, digitando una o più parole chiave.
 * '''Ubuntu 18.04 e successive''': lo strumento di ricerca è attivabile premendo l'icona a forma di lente d'ingrandimento integrata nella barra del titolo della finestra del programma;
 * '''Rilasci precedenti''': la '''barra di ricerca''' è posta direttamente sotto la barra superiore del programma.

= Installare un programma =

 0. Selezionare il pacchetto che si desidera installare dalla prima schermata ('''Esplora''' o '''Tutto''') oppure cercarlo attraverso la funzione di [[#ricerca|ricerca]].<<BR>> In Ubuntu 20.04, se il programma selezionato è in formato `.snap`, è inoltre possibile selezionare la versione da installare (ad esempio ''stable'', ''beta'' ecc.) nell'apposito menu a tendina in alto a sinistra.
 0. Fare clic su '''Installa'''.
 0. Verrà richiesta la password di [[AmministrazioneSistema/Sudo|amministratore]] e l'installazione avrà inizio.

= Rimuovere un pacchetto =

 0. Individuare il pacchetto da disinstallare scorrendo la lista nella schermata '''Installato''' oppure attraverso la funzione di [[#ricerca|ricerca]].
 0. Fare clic sul pulsante '''Rimuovi''' e inserire la password.

L'applicazione verrà rimossa.

= Aggiornare le applicazioni =

{{{#!wiki important
Allo stato attuale questa funzionalità aggiorna solo il parco software delle "App". Per l'aggiornamento completo del sistema utilizzare lo strumento [[AmministrazioneSistema/Aggiornamenti|Aggiornamenti Software]].
}}}

 0. Fare clic su '''Aggiornamenti'''.
 0. Fare clic sul pulsante di ricarica (freccia circolare in alto a sinistra).
 0. Installare gli eventuali aggiornamenti facendo clic sul pulsante che mostra il numero di pacchetti aggiornati disponibili.

= Gestire le sorgenti software (18.04 e precedenti) =

Selezionare il menù '''''Ubuntu Software → Software e aggiornamenti'''''. Quindi fare riferimento alla [[Repository/Ubuntu|relativa guida]].

= Installare pacchetti flatpak (18.04) =

Consultare la relativa [[AmministrazioneSistema/InstallareProgrammi/PacchettiFlatpak|guida]].

{{{#!wiki tip
È possibile aggiungere l'integrazione con flatpak anche su Ubuntu 20.04 se '''Software''' è stato installato in versione `.deb`, come descritto in questo [[#18.04|paragrafo]].
}}}

= Risoluzione problemi =

== Ubuntu Software non mostra applicazioni ==

In un sistema appena installato è possibile che '''Ubuntu Software''' risulti completamente vuoto e che non venga visualizzata nessuna applicazione installabile o aggiornabile.<<BR>>
Il più delle volte è possibile risolvere tale problema [[AmministrazioneSistema/InstallareProgrammi/Apt#Aggiornamento_del_sistema|aggiornando la lista dei pacchetti disponibili]]. Questa operazione è eseguibile da [[AmministrazioneSistema/Terminale|terminale]] digitando il comando: {{{
sudo apt update
}}}

== Impossibile avviare Ubuntu Software dopo aggiornamento ==

A causa del bug <<Bug(ubuntu 1606238)>>, alcuni utenti hanno riscontrato problemi nell'avviare '''Ubuntu Software'''. <<BR>>
Se non si riesce ad avviare il programma, è sufficiente rimuovere la cartella `~/.local/share/gnome-software/` per risolvere il problema. La cartella verrà automaticamente ricreata, una volta avviato nuovamente '''Ubuntu Software'''.
'''Bash''' (acronimo per '''b'''ourne '''a'''gain '''sh'''ell) è una '''[[https://it.wikipedia.org/wiki/Shell_(informatica)|shell]]''' del progetto '''[[https://it.wikipedia.org/wiki/Progetto_GNU|GNU]]''' usata nei sistemi operativi '''[[https://it.wikipedia.org/wiki/Unix-like|Unix-like]]''' e specialmente in '''GNU/Linux'''.<<BR>>
Si tratta di un interprete di comandi che permette all'utente di comunicare col sistema operativo attraverso una serie di funzioni predefinite o di eseguire programmi.

Tecnicamente '''bash''' è un clone evoluto della shell standard di Unix (`/bin/sh`), chiamata anche ''Bourne Shell'' da Stephen Bourne, nome del suo autore originario. Il nome esteso ''Bourne again shell'' («''un'altra shell Bourne''») contiene un gioco di parole in quanto la sua pronuncia in lingua inglese risulta simile a «''Born again shell''» («''shell rinata''»).

In pratica '''Bash''' può essere considerata come un processore di macro. Alcune delle sue principali caratteristiche sono le seguenti:

 * Può essere eseguita sia tramite dei comandi digitati nel [[AmministrazioneSistema/Terminale|terminale]], sia tramite degli appositi script (combinando così più comandi tra di loro, per svolgere compiti più complessi).
 * Possibilità, se necessario, di raccogliere in file una serie di comandi (in modo tale da creare script eseguibili contenenti variabili, funzioni e controlli di flusso, come nei più comuni linguaggi di programmazione).
 * Possibilità di ridirezione dell'input e dell'output (''redirect''), che consente di eseguire più programmi "a cascata", dove l'output di un comando può diventare input di un comando successivo.

Perciò '''GNU Bash''' è ricca di funzionalità sia per l'uso interattivo sia per lo ''scripting''. Tuttavia molte di queste funzioni sono poco note. Pertanto guida si propone come raccolta (non esaustiva) di "trucchi" più o meno noti relativi a '''Bash'''.

= Scripting =

== Variabili ==

Le variabili in ''bash scripting'' non hanno bisogno di inizializzazione, l'assegnazione avviene usando la sinossi:
{{{
VAR=valore
}}}
È molto importante che il valore sia scritto subito dopo l'uguale senza nessuno spazio.
I riferimenti a tutte le variabili si scrivono anteponendo il carattere ''$'' al nome della variabile:
{{{
VAR=world
echo hello $VAR!
}}}

== Variabili speciali ==

 *'''$N''' dove N è un numero intero, corrisponde all'argomento N-esimo passato da terminale al programma ($0 è il nome del programma).

 *'''$*''' stringa che contiene tutti gli argomenti passati da terminale al programma.

 *'''$#''' contiene il numero di argomenti passati da terminale al programma ($0 escluso).

 * '''$@''' Contiene la lista dei paramentri passati allo script corrente. Ogni parametro viene opportunamente quotato e questo permette l'utilizzo di questa variabile nei cicli for per processare, ad esempio, una lista di nomi di file che possono contenere anche spazi. L'uso di questa variabile è quindi in genere consigliato rispetto a $* che ha la stessa funzione ma non quota i vari parametri.

 * '''$? ''' Contiene il valore di uscita dell'ultimo comando o funzione. Il comando ha successo se ritorna zero, qualsiasi altro valore indica invece un codice di errore.

 *'''$$''' contiene il PID del processo in esecuzione.

 *'''$!''' contiene il PID dell'ultimo job in background.

== Esecuzione comandi ==

Dato che non è un vero linguaggio di programmazione, molte funzionalità non sono incluse nel ''bash scripting'' ma sono comunque usabili tramite dei programmi esterni..

Per prima cosa è utile sapere che per leggere l'output di un programma e, per esempio, inserirlo in una variabile s'usa la sinossi:
{{{
VAR=`uname -r`
echo `pwd`
}}}
oppure:
{{{
VAR=$(uname -r)
echo $(pwd)
}}}
tramite i caratteri di back-quote (ALT GR + ') o il carattere Dollaro (Shift+4) l'interprete bash esegue il comando e sostituisce con l'output tutta la chiavata. In questo caso, al posto di ''`uname -r` ''o ''$(uname -r)'', è equivalente una scrittura del tipo:
{{{
VAR=2.6.21
echo /usr/src/linux
}}}

=== Programmi utili ===

 * '''expr''': dato che non si possono eseguire semplici operazioni matematiche direttamente tramite l'interprete, questo comando può essere d'aiuto.

 * '''grep''': utile per mostrare solo alcune righe di un determinato output.

 * '''cut''': serve per "tagliare" una stringa in tante sotto-stringhe in base ad un determinato separatore. È molto simile allo !StringTokenizer in java.
 
 * '''cat''': data l'assenza di funzioni proprie dell'interprete per l'apertura e la lettura dei file, questo comando apre il file e stampa il suo contenuto. L'output stampato può essere reindirizzato in una variabile come spiegato sopra.

Per maggiori informazioni sui singoli comandi si rimanda ai manuali dei relativi programmi.

== Manipolazione delle stringhe ==

Tradizionalmente, nelle shell '''Unix-like''', la manipolazione delle stringhe viene fatta attraverso programmi esterni alla '''shell''' come '''sed''', '''awk''' e '''perl'''.

Questi programmi vengono ancora usati quando si vuole mantenere la compatibilità con la '''shell sh'''. Tuttavia imparare anche il solo '''sed''' (il più semplice dei tre) non è cosa immediata.

Se si usa '''Bash''' non è necessario usare nessun programma esterno, ma basta imparare i tre operatori fondamentali e alcuni concetti di base per poter eseguire tutte le manipolazioni più comuni.

In '''Bash''' una stringa non è altro che una variabile. Dunque si indica con '''${nome}''' oppure con la forma abbreviata '''$nome'''. Il nome dentro le graffe può essere seguito da un modificatore che manipola la variabile, ad esempio:
{{{
 VAR="stringa-di-esempio"
 echo ${VAR#stringa-}
}}}
elimina "'''stringa-'''" dall'inizio della variabile.

I modificatori sono molti, ma possono essere facilmente ricordati se si imparano i tre fondamentali:

 * '''#''': sottrae dall'inizio della stringa (minimale).
 * '''%''': sottrae dalla fine della stringa (minimale).
 *'''/ ''': sostituisce una sotto-stringa con un'altra (solo la prima volta che viene incontrata).

Questi operatori sono minimali, questo vuol dire che se si usano le espressioni regolari per indicare la sotto-stringa (da eliminare o sostituire) verrà individuata in caso di ambiguità la sotto-stringa più piccola (o solo la prima nel caso della sostituzione).

Per ottenere gli operatori massimali basta raddoppiare il simbolo:
 * '''##''': sottrae dall'inizio della stringa (massimale).
 * '''%%''': sottrae dalla fine della stringa (massimale).
 * '''//''': sostituisce una sotto-stringa con un altra (tutte le volte che viene incontrata).

Gli operatori massimali cercano di individuare la sotto-stringa più grande che corrisponde all'espressione regolare (nel caso del modificatore '''//''' tutte le sotto-stringhe vengono sostituite). Gli operatori di questo tipo vengono comunemente detti anche ''greedy'' («ingordi»).

Per ulteriori informazioni più dettagliate su tutti i modificatori e altre modalità di manipolazione delle stringhe in '''Bash''' consultare [[http://www.tldp.org/LDP/abs/html/string-manipulation.html|questa guida]].

===== Esempio: Manipolazione delle stringhe =====
{{{
 VAR="questa.è.una.stringa.di.esempio"
 
                                    # Risultato:
 
 echo ${VAR#*.} # --> è.una.stringa.di.esempio
 echo ${VAR##*.} # --> esempio
 
 echo ${VAR%.*} # --> questa.è.una.stringa.di
 echo ${VAR%%.*} # --> questa
 
 echo ${VAR/st/ST} # --> queSTa.è.una.stringa.di.esempio
 echo ${VAR//st/ST} # --> queSTa.è.una.STringa.di.esempio
}}}

=== Alternativa a basename ===

Quando in uno script ci si deve riferire al nome dello script stesso è usuale utilizzare il comando basename (esterno a bash). Tuttavia, tramite i modificatori del paragrafo precedente, Bash stessa è in grado di fornire questa funzionalità. Basta usare l'espressione ${0##*/}.

Ad esempio:
{{{
usage () {
        echo "usage: ${0##*/} "
        exit 1
}
}}}

===== Esempio: cambiare l'estensione ai file =====
Rinomina tutti i file `*.txt` della directory corrente in `*.log`:{{{
for f in *.txt; do mv "$f" "${f/%txt/log}"; done
}}}
== Condizioni ==
Le operazioni condizionali in bash possono essere eseguite in due modi, tramite il blocco ''if..then..else'' (simile al suo omonimo in c) o tramite il blocco ''case..in'' (simile allo switch).
=== If..Then..Else ===
Tutto il lavoro di questo blocco è svolto dal programma bash '''test''', il suo uso è:

{{{
test [espr]
}}}
ci sono molte espressioni possibili, le più comuni sono:
 * '''-f nomefile''': ritorna vero se il file esiste.
 * '''-d directory''': ritorna vero se la directory esiste.
 * '''str1 = str2''': ritorna vero se la str1 è uguale alla str2.
 * '''str1 != str2''': ritorna vero se la str1 è diversa dalla str2.
 * '''arg1 -eq arg2''': confronto numerico, ritorna vero se arg1 è uguale a arg2.
 * '''arg1 -ne arg2''': confronto numerico, ritorna vero se arg1 è diverso a arg2.
 * '''arg1 -lt arg2''': confronto numerico, ritorna vero se arg1 è minore a arg2 ('''-le''' per maggiore o uguale).
 * '''arg1 -gt arg2''': confronto numerico, ritorna vero se arg1 è maggiore a arg2 ('''-ge''' per maggiore o uguale).
 * '''espr1 -o espr2''': concatena più condizioni, uguale all'or, ritorna vero o se l'espr1 o se l'espr2 ritorna vero.
 * '''espr1 -a espr2''': concatena più condizioni, uguale all'and, ritorna vero se sia l'espr1 che l'espr2 ritornano vero.

Questo è un esempio d'uso del costrutto if:

{{{
if [ -f prova.txt ]
 then
       echo Il file esiste!
  else
       echo Il file non esiste!
fi
}}}

Altra sinossi del costrutto ''if'':

{{{
if [ -f prova.txt ];then echo Il file esiste!;else echo Il file non esiste!;fi
}}}

Come si può notare, inserire tra parentesi quadre l'espressione da testare è equivalente a scrivere:
{{{
test -f prova.txt
}}}
L'if bash è molto rigoroso dal punto di vista sintattico. Dopo l'espressione da valutare è necessario andare o a capo e scrivere la parola chiave ''then'', oppure frapporre un ''';''' e scrivere di seguito la parola chiave.

Si noti inoltre che non c'è bisogno di parentesi graffe, infatti il blocco viene terminato con la parola chiave ''fi''.

=== Case..in ===

L'uso del blocco ''case'' è molto semplice:

{{{
case $a in
 1) echo sono un 1;;
 2) echo sono un 2;;
 3) echo sono un 3;;
 *) echo Non sono ne un 1 ne un 2 ne un 3;;
esac
}}}
viene valutata $a ed in base al valore contenuto vengono eseguite le operazioni associate.

Si noti inoltre che non c'è bisogno di parentesi graffe, infatti il blocco viene terminato con la parola chiave ''esac''.

== Cicli enumerativi ==

Al contrario di altri linguaggi, nel Bash Scripting i cicli sono del tipo enumerativo, cioè eseguono le operazioni per tutti gli elementi presenti un una lista indicata. Il più importante è sicuramente il ciclo ''for..do''.

=== For..do ===
La sua sinossi è:
{{{
for [VAR] [in [LIST]]
 do
    [COMANDI]
done
}}}
il cui parametro dopo ''in'' rappresenta la lista prima citata.

Nel seguente esempio il ciclo stamperà sullo standard output ''1 2 3 4 5'':
{{{
for i in 1 2 3 4 5
 do
    echo sono $i
done
}}}

In questo altro esempio il ciclo stamperà una lista di file:
{{{
for i in *
 do
    echo Sono il file $i
done
}}}
Linea 122: Linea 243:

 * [[https://wiki.gnome.org/Apps/Software|Pagina ufficiale del progetto]]
 * [[AmministrazioneSistema/InstallareProgrammi|Installare programmi]]
 * [[Repository|Repository: cosa sono e come gestirli]]
 * [[http://www.gnu.org/software/bash/manual/bash.html|Manuale ufficiale di Bash]]
 * [[http://www.tldp.org/LDP/abs/html/|Guida avanzata di scripting Bash]]
 * [[http://www.pluto.it/files/ildp/guide/abs/index.html|Guida avanzata di scripting Bash in italiano]]
Linea 128: Linea 248:
CategoryHomepage
##CategoryA
mministrazione

CategoryProgrammazione


Attenzione! Questa è una Pagina di prova. Le informazioni riportate potrebbero essere incomplete, errate e potenzialmente pericolose. Per contribuire alla realizzazione di questa pagina consultare la discussione di riferimento.

Problemi in questa pagina? Segnalali in questa discussione

Introduzione

Bash (acronimo per bourne again shell) è una shell del progetto GNU usata nei sistemi operativi Unix-like e specialmente in GNU/Linux.
Si tratta di un interprete di comandi che permette all'utente di comunicare col sistema operativo attraverso una serie di funzioni predefinite o di eseguire programmi.

Tecnicamente bash è un clone evoluto della shell standard di Unix (/bin/sh), chiamata anche Bourne Shell da Stephen Bourne, nome del suo autore originario. Il nome esteso Bourne again shellun'altra shell Bourne») contiene un gioco di parole in quanto la sua pronuncia in lingua inglese risulta simile a «Born again shell» («shell rinata»).

In pratica Bash può essere considerata come un processore di macro. Alcune delle sue principali caratteristiche sono le seguenti:

  • Può essere eseguita sia tramite dei comandi digitati nel terminale, sia tramite degli appositi script (combinando così più comandi tra di loro, per svolgere compiti più complessi).

  • Possibilità, se necessario, di raccogliere in file una serie di comandi (in modo tale da creare script eseguibili contenenti variabili, funzioni e controlli di flusso, come nei più comuni linguaggi di programmazione).
  • Possibilità di ridirezione dell'input e dell'output (redirect), che consente di eseguire più programmi "a cascata", dove l'output di un comando può diventare input di un comando successivo.

Perciò GNU Bash è ricca di funzionalità sia per l'uso interattivo sia per lo scripting. Tuttavia molte di queste funzioni sono poco note. Pertanto guida si propone come raccolta (non esaustiva) di "trucchi" più o meno noti relativi a Bash.

Scripting

Variabili

Le variabili in bash scripting non hanno bisogno di inizializzazione, l'assegnazione avviene usando la sinossi:

VAR=valore

È molto importante che il valore sia scritto subito dopo l'uguale senza nessuno spazio. I riferimenti a tutte le variabili si scrivono anteponendo il carattere $ al nome della variabile:

VAR=world
echo hello $VAR!

Variabili speciali

  • $N dove N è un numero intero, corrisponde all'argomento N-esimo passato da terminale al programma ($0 è il nome del programma).

  • $* stringa che contiene tutti gli argomenti passati da terminale al programma.

  • $# contiene il numero di argomenti passati da terminale al programma ($0 escluso).

  • $@ Contiene la lista dei paramentri passati allo script corrente. Ogni parametro viene opportunamente quotato e questo permette l'utilizzo di questa variabile nei cicli for per processare, ad esempio, una lista di nomi di file che possono contenere anche spazi. L'uso di questa variabile è quindi in genere consigliato rispetto a $* che ha la stessa funzione ma non quota i vari parametri.

  • $? Contiene il valore di uscita dell'ultimo comando o funzione. Il comando ha successo se ritorna zero, qualsiasi altro valore indica invece un codice di errore.

  • $$ contiene il PID del processo in esecuzione.

  • $! contiene il PID dell'ultimo job in background.

Esecuzione comandi

Dato che non è un vero linguaggio di programmazione, molte funzionalità non sono incluse nel bash scripting ma sono comunque usabili tramite dei programmi esterni..

Per prima cosa è utile sapere che per leggere l'output di un programma e, per esempio, inserirlo in una variabile s'usa la sinossi:

VAR=`uname -r`
echo `pwd`

oppure:

VAR=$(uname -r)
echo $(pwd)

tramite i caratteri di back-quote (ALT GR + ') o il carattere Dollaro (Shift+4) l'interprete bash esegue il comando e sostituisce con l'output tutta la chiavata. In questo caso, al posto di uname -r o $(uname -r), è equivalente una scrittura del tipo:

VAR=2.6.21
echo /usr/src/linux

Programmi utili

  • expr: dato che non si possono eseguire semplici operazioni matematiche direttamente tramite l'interprete, questo comando può essere d'aiuto.

  • grep: utile per mostrare solo alcune righe di un determinato output.

  • cut: serve per "tagliare" una stringa in tante sotto-stringhe in base ad un determinato separatore. È molto simile allo StringTokenizer in java.

  • cat: data l'assenza di funzioni proprie dell'interprete per l'apertura e la lettura dei file, questo comando apre il file e stampa il suo contenuto. L'output stampato può essere reindirizzato in una variabile come spiegato sopra.

Per maggiori informazioni sui singoli comandi si rimanda ai manuali dei relativi programmi.

Manipolazione delle stringhe

Tradizionalmente, nelle shell Unix-like, la manipolazione delle stringhe viene fatta attraverso programmi esterni alla shell come sed, awk e perl.

Questi programmi vengono ancora usati quando si vuole mantenere la compatibilità con la shell sh. Tuttavia imparare anche il solo sed (il più semplice dei tre) non è cosa immediata.

Se si usa Bash non è necessario usare nessun programma esterno, ma basta imparare i tre operatori fondamentali e alcuni concetti di base per poter eseguire tutte le manipolazioni più comuni.

In Bash una stringa non è altro che una variabile. Dunque si indica con ${nome} oppure con la forma abbreviata $nome. Il nome dentro le graffe può essere seguito da un modificatore che manipola la variabile, ad esempio:

 VAR="stringa-di-esempio"
 echo ${VAR#stringa-}

elimina "stringa-" dall'inizio della variabile.

I modificatori sono molti, ma possono essere facilmente ricordati se si imparano i tre fondamentali:

  • #: sottrae dall'inizio della stringa (minimale).

  • %: sottrae dalla fine della stringa (minimale).

  • / : sostituisce una sotto-stringa con un'altra (solo la prima volta che viene incontrata).

Questi operatori sono minimali, questo vuol dire che se si usano le espressioni regolari per indicare la sotto-stringa (da eliminare o sostituire) verrà individuata in caso di ambiguità la sotto-stringa più piccola (o solo la prima nel caso della sostituzione).

Per ottenere gli operatori massimali basta raddoppiare il simbolo:

  • ##: sottrae dall'inizio della stringa (massimale).

  • %%: sottrae dalla fine della stringa (massimale).

  • //: sostituisce una sotto-stringa con un altra (tutte le volte che viene incontrata).

Gli operatori massimali cercano di individuare la sotto-stringa più grande che corrisponde all'espressione regolare (nel caso del modificatore // tutte le sotto-stringhe vengono sostituite). Gli operatori di questo tipo vengono comunemente detti anche greedy («ingordi»).

Per ulteriori informazioni più dettagliate su tutti i modificatori e altre modalità di manipolazione delle stringhe in Bash consultare questa guida.

Esempio: Manipolazione delle stringhe

 VAR="questa.è.una.stringa.di.esempio"
 
                                    # Risultato:
 
 echo ${VAR#*.}        # --> è.una.stringa.di.esempio
 echo ${VAR##*.}     # --> esempio
 
 echo ${VAR%.*}       # --> questa.è.una.stringa.di
 echo ${VAR%%.*}    # --> questa
 
 echo ${VAR/st/ST}   # --> queSTa.è.una.stringa.di.esempio
 echo ${VAR//st/ST}  # --> queSTa.è.una.STringa.di.esempio

Alternativa a basename

Quando in uno script ci si deve riferire al nome dello script stesso è usuale utilizzare il comando basename (esterno a bash). Tuttavia, tramite i modificatori del paragrafo precedente, Bash stessa è in grado di fornire questa funzionalità. Basta usare l'espressione ${0##*/}.

Ad esempio:

usage () {
        echo "usage: ${0##*/} "
        exit 1
}

Esempio: cambiare l'estensione ai file

Rinomina tutti i file *.txt della directory corrente in *.log:

for f in *.txt; do mv "$f" "${f/%txt/log}"; done

Condizioni

Le operazioni condizionali in bash possono essere eseguite in due modi, tramite il blocco if..then..else (simile al suo omonimo in c) o tramite il blocco case..in (simile allo switch).

If..Then..Else

Tutto il lavoro di questo blocco è svolto dal programma bash test, il suo uso è:

test [espr]

ci sono molte espressioni possibili, le più comuni sono:

  • -f nomefile: ritorna vero se il file esiste.

  • -d directory: ritorna vero se la directory esiste.

  • str1 = str2: ritorna vero se la str1 è uguale alla str2.

  • str1 != str2: ritorna vero se la str1 è diversa dalla str2.

  • arg1 -eq arg2: confronto numerico, ritorna vero se arg1 è uguale a arg2.

  • arg1 -ne arg2: confronto numerico, ritorna vero se arg1 è diverso a arg2.

  • arg1 -lt arg2: confronto numerico, ritorna vero se arg1 è minore a arg2 (-le per maggiore o uguale).

  • arg1 -gt arg2: confronto numerico, ritorna vero se arg1 è maggiore a arg2 (-ge per maggiore o uguale).

  • espr1 -o espr2: concatena più condizioni, uguale all'or, ritorna vero o se l'espr1 o se l'espr2 ritorna vero.

  • espr1 -a espr2: concatena più condizioni, uguale all'and, ritorna vero se sia l'espr1 che l'espr2 ritornano vero.

Questo è un esempio d'uso del costrutto if:

if [ -f prova.txt ]
 then
       echo Il file esiste!
  else
       echo Il file non esiste!
fi

Altra sinossi del costrutto if:

if [ -f prova.txt ];then echo Il file esiste!;else echo Il file non esiste!;fi

Come si può notare, inserire tra parentesi quadre l'espressione da testare è equivalente a scrivere:

test -f prova.txt

L'if bash è molto rigoroso dal punto di vista sintattico. Dopo l'espressione da valutare è necessario andare o a capo e scrivere la parola chiave then, oppure frapporre un ; e scrivere di seguito la parola chiave.

Si noti inoltre che non c'è bisogno di parentesi graffe, infatti il blocco viene terminato con la parola chiave fi.

Case..in

L'uso del blocco case è molto semplice:

case $a in 
 1) echo sono un 1;;
 2) echo sono un 2;;
 3) echo sono un 3;;
 *) echo Non sono ne un 1 ne un 2 ne un 3;;
esac

viene valutata $a ed in base al valore contenuto vengono eseguite le operazioni associate.

Si noti inoltre che non c'è bisogno di parentesi graffe, infatti il blocco viene terminato con la parola chiave esac.

Cicli enumerativi

Al contrario di altri linguaggi, nel Bash Scripting i cicli sono del tipo enumerativo, cioè eseguono le operazioni per tutti gli elementi presenti un una lista indicata. Il più importante è sicuramente il ciclo for..do.

For..do

La sua sinossi è:

for [VAR] [in [LIST]]
 do
    [COMANDI]
done

il cui parametro dopo in rappresenta la lista prima citata.

Nel seguente esempio il ciclo stamperà sullo standard output 1 2 3 4 5:

for i in 1 2 3 4 5
 do
    echo sono $i
done

In questo altro esempio il ciclo stamperà una lista di file:

for i in *
 do
    echo Sono il file $i
done

Ulteriori risorse


CategoryProgrammazione