Bash scripting: differenze tra le versioni

ristrutturazione dei paragrafi
(ristrutturazione dei paragrafi)
Riga 39: Riga 39:
; <code>$!</code> : PID dell'ultimo job in background.
; <code>$!</code> : PID dell'ultimo job in background.


===Alternativa a basename===
''Esempio:''
Quando in uno script ci si deve riferire al nome dello script stesso è usuale utilizzare il comando (esterno a bash) <code>'''basename'''</code>. Tuttavia, tramite i modificatori del paragrafo precedente, Bash stessa è in grado di fornire questa funzionalità. Basta usare l'espressione <code>${0##*/}</code>.
 
Esempio:
<pre>
<pre>
usage () {
comando &  # lancio un comando in background
        echo "usage: ${0##*/} "
pid=$!    # ottengo il PID del comando
        exit 1
...        # eseguo altre operazioni
}
wait $pid  # riporto il comando in foreground
</pre>
</pre>


Riga 147: Riga 144:
   echo ${VAR/st/ST}  # --> queSTa.sarebbe.una.stringa.di.esempio
   echo ${VAR/st/ST}  # --> queSTa.sarebbe.una.stringa.di.esempio
   echo ${VAR//st/ST}  # --> queSTa.sarebbe.una.STringa.di.esempio</pre>
   echo ${VAR//st/ST}  # --> queSTa.sarebbe.una.STringa.di.esempio</pre>
===Esempio: alternativa a basename===
Quando in uno script ci si deve riferire al nome dello script stesso è usuale utilizzare il comando (esterno a bash) <code>'''basename'''</code>. Tuttavia, tramite i modificatori del paragrafo precedente, Bash stessa è in grado di fornire questa funzionalità. Basta usare l'espressione <code>${0##*/}</code>.
<pre>
usage () {
        echo "usage: ${0##*/} "
        exit 1
}
</pre>


==Caratteri di escape==
==Caratteri di escape==
Riga 152: Riga 159:
Alcuni caratteri hanno un valore speciale per la shell, per consentirne le espansioni (di variabile, parametro, comando, percorso, ecc...). Di conseguenza se si intende scrivere un carattere speciale senza espanderlo, è necessario comunicarlo alla shell facendolo precedere da un carattere di escape '<code>\</code>' oppure racchiudendolo tra apici o virgolette (a seconda dell'espansione da disattivare).
Alcuni caratteri hanno un valore speciale per la shell, per consentirne le espansioni (di variabile, parametro, comando, percorso, ecc...). Di conseguenza se si intende scrivere un carattere speciale senza espanderlo, è necessario comunicarlo alla shell facendolo precedere da un carattere di escape '<code>\</code>' oppure racchiudendolo tra apici o virgolette (a seconda dell'espansione da disattivare).


Questa sezione non è esaustiva, ma consiglia qualche semplice accorgimento:
Questa sezione non è esaustiva, ma consiglia qualche semplice accorgimento.
 
===Racchiudere tra apici===


* racchiudere tra apici (apostrofi) una stringa riduce a uno soltanto i caratteri speciali, ossia lo stesso apice, rappresentando la stringa per il suo solo valore letterale e impedendo tutte le espansioni. Lo svantaggio è che non esiste un carattere di escape, e che quindi un apice contenuto nella stringa non può essere racchiuso tra apici, rendendone più complicato l'escape. Per esempio:
Racchiudendo tra apici (apostrofi) una stringa, si riducono i caratteri speciali a uno soltanto, ossia lo stesso apice, rappresentando la stringa per il suo solo valore letterale e impedendo tutte le espansioni. Lo svantaggio è che non esiste un carattere di escape, e che quindi un apice non può essere racchiuso tra apici in alcun modo. Per esempio:
:<pre>echo '$PATH "" \ `ls ..` \$HOME ~ * .[a-z]*'  # stampa la stringa tra apici, così com'è scritta</pre>
:<pre>echo '$PATH "" \ `ls ..` \$HOME ~ * .[a-z]*'  # stampa la stringa tra apici, così com'è scritta</pre>
:<pre>echo 'L'\''albero di... ' # l'accento non deve essere racchiuso tra apici, e va preceduto da \</pre>
:<pre>echo 'L'\''albero di... ' # stampa "L'albero di..." (l'accento non può essere racchiuso tra apici e va preceduto da \)</pre>
 
===Quotare (racchiudere tra virgolette)===
 
Racchiudere tra virgolette (ossia quotare) ogni stringa è in genere raccomandabile e la scelta consigliata, così da ridurre drasticamente il numero di caratteri speciali, permettendo allo stesso tempo l'espansione delle variabili e dei comandi. I soli caratteri speciali sono <code>$</code>, <code>`</code> (ma non l'apice), <code>"</code> e <code>\</code> devono essere preceduti dal carattere di escape <code>\</code>. Le espansioni di percorso e tilda (*, ?, [...], ~, ... ) non sono possibili; mentre lo sono quelle di variabile e parametro (attraverso un <code>$</code> senza <code>\</code>), e quelle di comando (attraverso un <code>`</code> o un <code>$(</code> senza <code>\</code>).
 
Riprendendo l'esempio e considerandolo per parti:
<pre>
echo "$PATH"      # espande la variabile PATH e ne stampa il contenuto.
echo "\"\" \\"    # è equivalente a '"" \', si noti l'uso dei \ con le virgolette.
echo "`ls ..`"    # Esegue il comando "ls .." e ne stampa l'output. È equivalente a "$(ls ..)".
echo "\$HOME"      # stampa letteralmente $HOME, senza espanderla. È equivalente a '$HOME'.
echo "~ * .[a-z]*" # espande PATH e il comando ls, ma non HOME. Si noti l'uso dei \.
</pre>
 
====Espansione di comando====
 
Si effettua racchiudendo un comando tra <code>$(</code> e <code>)</code>, oppure tra due apici gravi <code>`</code> (su tastiera con layout italiano: <code>Alt Gr + '</code>). La prima forma è la più leggibile e quella consigliata.
 
L'output del comando consiste in zero, una o più stringhe, in base agli spazi presenti nell'output prodotto e in maniera analoga all'espansione a cui sono soggette le variabili. Per trasformare l'output di un comando in una singola stringa è necessario che l'espansione di comando sia quotata, con l'eccezione dell'assegnazione a una variabile.
 
Per esempio:
<pre>
oggi=$(date +%F) # assegna a oggi la data in formato YYYY_MM_DD
</pre>


* racchiudere tra virgolette (ossia quotare) ogni stringa è in genere raccomandabile e la scelta consigliata, così da ridurre drasticamente il numero di caratteri speciali, permettendo l'uso delle variabili. I soli caratteri speciali sono <code>$</code>, <code>`</code> (ma non l'apice), <code>"</code> e <code>\</code> devono essere preceduti dal carattere di escape <code>\</code>. Le espansioni di percorso e tilda (*, ?, [...], ~, ... ) non sono possibili; mentre lo sono quelle di variabile e parametro (attraverso un <code>$</code> senza <code>\</code>), e quelle di comando (attraverso un <code>`</code> o un <code>$(</code> senza <code>\</code>). Riprendendo l'esempio:
==Espansione di tilda e percorso==
:<pre>echo "$PATH \"\" \\ `ls ..` \$HOME ~ * .[a-z]*" # espande PATH e il comando ls, ma non HOME. Si noti l'uso dei \.</pre>


* non racchiudere tra virgolette e apici serve a permettere le espansioni di percorso e tilda. È sempre consigliabile racchiudere tutto il resto tra virgolette. I più comuni sono (si ricordi per le espansioni che su ambienti UNIX e Unix-like per file si intende sia un file regolare, sia una directory, un link, una pipe, un socket, un device, ecc...):
Non racchiudere tra virgolette e apici serve a permettere le espansioni di percorso e tilda. È sempre consigliabile racchiudere tutto il resto tra virgolette. I più comuni sono (si ricordi per le espansioni che su ambienti UNIX e Unix-like per file si intende sia un file regolare, sia una directory, un link, una pipe, un socket, un device, ecc...):
** <code>~</code> espande alla home (equivalente alla variabile $HOME, che però può essere quotata);
** <code>~</code> espande alla home (equivalente alla variabile $HOME, che però può essere quotata);
*** <code>~utente</code> espande alla home di un dato utente, ma la stringa utente non può essere quotata né essere una variabile da espandere;
*** <code>~utente</code> espande alla home di un dato utente, ma la stringa utente non può essere quotata né essere una variabile da espandere;
Riga 182: Riga 214:
done</pre>
done</pre>


=== Cambiare l'estensione ai file ===
===Esempio: cambiare l'estensione ai file ===
Rinomina tutti i file <code>*.txt</code> della directory corrente in <code>*.log</code>:
Rinomina tutti i file <code>*.txt</code> della directory corrente in <code>*.log</code>:


Riga 264: Riga 296:
|Verificata_da=
|Verificata_da=
:[[Utente:S3v|S3v]] (versione in Bash tips)
:[[Utente:S3v|S3v]] (versione in Bash tips)
:[[Utente:HAL 9000|HAL 9000]] 20:06, 2 lug 2014 (CEST)
:[[Utente:HAL 9000|HAL 9000]] 13:01, 3 lug 2014 (CEST)
|Estesa_da=
|Estesa_da=
:[[Utente:S3v|S3v]] (versione in Bash tips)
:[[Utente:S3v|S3v]] (versione in Bash tips)
3 581

contributi