3 581
contributi
(ristrutturazione dei paragrafi) |
|||
Riga 39: | Riga 39: | ||
; <code>$!</code> : PID dell'ultimo job in background. | ; <code>$!</code> : PID dell'ultimo job in background. | ||
''Esempio:'' | |||
<pre> | <pre> | ||
comando & # lancio un comando in background | |||
pid=$! # ottengo il PID del comando | |||
... # 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=== | |||
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 | :<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> | |||
==Espansione di tilda e percorso== | |||
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> | ||
=== | ===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]] | :[[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) |
contributi