Bash scripting - espansioni quotabili: differenze tra le versioni

m
nessun oggetto della modifica
m (uso opzione -u con espansione di parametro)
mNessun oggetto della modifica
Riga 1: Riga 1:
{{Bash_scripting}}
{{Bash_scripting}}
=Espansioni in stringhe quotate=
__TOC__
Le espansione attivate da <code>$</code> avvengono con la stessa priorità, e in una stringa quotata sono le uniche permesse, quindi il risultato di un'espansione non può mai essere espanso un'altra volta. Sono permesse le sole espansioni di variabile, già vista, e di parametro, di comando e aritmetica (intera), che saranno trattate in seguito.
Le espansione attivate da <code>$</code> avvengono con la stessa priorità, e in una stringa quotata sono le uniche permesse, quindi il risultato di un'espansione non può mai essere espanso un'altra volta. Sono permesse le sole espansioni di variabile, già vista, e di parametro, di comando e aritmetica (intera), che saranno trattate in seguito.


==Espansione di parametro (stringa)==
== Espansione di parametro (stringa) ==
È una forma modificata dell'espansione di variabile, che permette di operare sulla stringa contenuta con un modificatore.
È una forma modificata dell'espansione di variabile, che permette di operare sulla stringa contenuta con un modificatore.


Riga 38: Riga 38:
</pre>
</pre>


===Manipolazione delle stringhe===
=== Manipolazione delle stringhe ===
Per manipolare una stringa, è possibile assegnarla a una variabile per poi effettuarne un'espansione di parametro che manipola la stringa, senza modificare il contenuto della variabile. Per esempio:
Per manipolare una stringa, è possibile assegnarla a una variabile per poi effettuarne un'espansione di parametro che manipola la stringa, senza modificare il contenuto della variabile. Per esempio:
<pre>
<pre>
Riga 78: Riga 78:
Le espressioni regolari supportate sono le stesse permesse nelle espansioni di parametro e con lo stesso significato (ossia: <code>? * [ ]</code>), e con gli operatori di sottrazione c'è differenza tra quelli minimali e massimali soltanto se il pattern contiene uno o più <code>*</code>, che è l'unico carattere speciale che può sostituire un numero qualsiasi (zero o più) di caratteri.
Le espressioni regolari supportate sono le stesse permesse nelle espansioni di parametro e con lo stesso significato (ossia: <code>? * [ ]</code>), e con gli operatori di sottrazione c'è differenza tra quelli minimali e massimali soltanto se il pattern contiene uno o più <code>*</code>, che è l'unico carattere speciale che può sostituire un numero qualsiasi (zero o più) di caratteri.


====Esempio: alternativa a basename====
==== Esempio: alternativa a basename ====
Quando in uno script ci si deve riferire al nome dello script stesso, è usuale utilizzare il comando esterno <code>'''basename'''</code>. Una possibile alternativa:
Quando in uno script ci si deve riferire al nome dello script stesso, è usuale utilizzare il comando esterno <code>'''basename'''</code>. Una possibile alternativa:
<pre>
<pre>
Riga 86: Riga 86:
</pre>
</pre>


====Esempi: manipolazione delle stringhe====
==== Esempi: manipolazione delle stringhe ====
<pre>
<pre>
VAR="questa.sarebbe.UNA.stringa.di.esempio"
VAR="questa.sarebbe.UNA.stringa.di.esempio"
Riga 111: Riga 111:
* [http://www.tldp.org/LDP/abs/html/string-manipulation.html Advanced Bash-Scripting Guide: Manipulating Strings]
* [http://www.tldp.org/LDP/abs/html/string-manipulation.html Advanced Bash-Scripting Guide: Manipulating Strings]


==Espansione di comando==
== Espansione di comando ==
Consiste nel trasformare l'output di un comando qualsiasi (interno della shell, esterno, una funzione e anche forme composte) in argomenti per un altro comando, oppure nel valore da assegnare a una variabile. Si effettua racchiudendo un comando tra <code>$(...)</code>:
Consiste nel trasformare l'output di un comando qualsiasi (interno della shell, esterno, una funzione e anche forme composte) in argomenti per un altro comando, oppure nel valore da assegnare a una variabile. Si effettua racchiudendo un comando tra <code>$(...)</code>:
<pre>$(comando)</pre>
<pre>$(comando)</pre>
Riga 127: Riga 127:
oggi="$(date '+%F')" # equivalente a sopra (non servono nelle assegnazioni)
oggi="$(date '+%F')" # equivalente a sopra (non servono nelle assegnazioni)


# associo a testo la dimensione in bytes di $file
# associo a testo la dimensione in byte di $file
testo=$(wc -c -- $file)    # SBAGLIATO! (se la variabile $file contiene spazi o caratteri speciali)
testo=$(wc -c -- $file)    # SBAGLIATO! (se la variabile $file contiene spazi o caratteri speciali)
testo=$(wc -c -- "$file")  # le virgolette attorno alla variabile sono necessarie
testo=$(wc -c -- "$file")  # le virgolette attorno alla variabile sono necessarie
Riga 145: Riga 145:
bytes=${testo%% *}          # estraggo il primo argomento
bytes=${testo%% *}          # estraggo il primo argomento
</pre>
</pre>
Mentre invece <code>date</code> non può fallire in condizioni normali, se non per errori di sintassi di chi ha scritto lo script, per cui non è necessario controllarne l'exit status. Implicitamente si assume che, se si utilizza '''bash''', allora tutti i comandi di sistema siano sufficientemente avanzati da supportare anche opzioni non previste da ''POSIX'' o di trovarsi su una distribuzione GNU/Linux. Si noti però che il comando <code>date</code> potrebbe fallire su altri sistemi, a seconda della versione installata, se non ci si limita alle opzioni previste da ''POSIX'' per il comando.
Mentre invece <code>date</code> non può fallire in condizioni normali, se non per errori di sintassi di chi ha scritto lo script, per cui non è necessario controllarne l'exit status. Implicitamente si assume che, se si utilizza '''bash''', allora tutti i comandi di sistema siano sufficientemente avanzati da supportare anche opzioni non previste da [[POSIX]] o di trovarsi su una distribuzione GNU/Linux. Si noti però che il comando <code>date</code> potrebbe fallire su altri sistemi, a seconda della versione installata, se non ci si limita alle opzioni previste da ''POSIX'' per il comando.


Passaggio dell'output dei comandi come argomento:
Passaggio dell'output dei comandi come argomento:
Riga 158: Riga 158:
Per decidere se l'exit status di un comando sia da controllare o meno è in genere sufficiente chiedersi se può fallire per azioni che possono (potenzialmente) essere compiute dall'utente, come fornire un percorso di file non valido o inesistente. Altre possibilità sono in genere ignorate, perché se si volesse una compatibilità ancora maggiore probabilmente non si starebbe usando '''bash''' in primo luogo.
Per decidere se l'exit status di un comando sia da controllare o meno è in genere sufficiente chiedersi se può fallire per azioni che possono (potenzialmente) essere compiute dall'utente, come fornire un percorso di file non valido o inesistente. Altre possibilità sono in genere ignorate, perché se si volesse una compatibilità ancora maggiore probabilmente non si starebbe usando '''bash''' in primo luogo.


===Output con a capo finali===
=== Output con a capo finali ===
Si noti che l'espansione di comando, come anche in '''sh''' (''POSIX''), non espande il comando a tutto l'output prodotto, ma omette sempre gli "a capo" finali. Se da una parte è utile nella maggior parte delle situazioni, può talvolta avere effetti collaterali difficili da prevedere. Si consideri per esempio:
Si noti che l'espansione di comando, come anche in '''sh''' (''POSIX''), non espande il comando a tutto l'output prodotto, ma omette sempre gli "a capo" finali. Se da una parte è utile nella maggior parte delle situazioni, può talvolta avere effetti collaterali difficili da prevedere. Si consideri per esempio:
<pre>
<pre>
Riga 169: Riga 169:
</pre>
</pre>


{{Warningbox | Una variabile non può contenere il carattere ASCII numero 0, quindi per i file binari è sempre sbagliato accederli in questo modo. È sconsigliabile anche se non si è certi della loro dimensione, e se si è interessati soltanto alla prima riga si può utilizzare:
{{Warningbox | Una variabile non può contenere il carattere ASCII numero 0, quindi per i file binari è sempre sbagliato accedervi in questo modo. È sconsigliabile anche se non si è certi della loro dimensione, e se si è interessati soltanto alla prima riga si può utilizzare:


<code>read riga < file_prova</code>}}
<code>read riga < file_prova</code>}}
Riga 191: Riga 191:
</pre>
</pre>


====Output più complessi con a capo finale====
==== Output più complessi con a capo finale ====
Proviamo ora con un esempio più complesso con il comando <code>readlink</code>, che stampa il percorso dato in forma assoluta, anche seguendo eventuali link simbolici.
Proviamo ora con un esempio più complesso con il comando <code>readlink</code>, che stampa il percorso dato in forma assoluta, anche seguendo eventuali link simbolici.


Riga 226: Riga 226:
fi
fi
</pre>
</pre>
Si noti però che se esistessero multipli file, con lo stesso nome a parte la presenza degli "a capo" finali, non verrebbe mai restituito errore con nessuno di loro, ma ogni volta che si specifica uno dei file con "a capo" si finirebbe per usare sempre il file senza "a capo" finali senza accorgersene.
Si noti però che se esistessero file multipli, con lo stesso nome a parte la presenza degli "a capo" finali, non verrebbe mai restituito errore con nessuno di loro, ma ogni volta che si specifica uno dei file con "a capo" si finirebbe per usare sempre il file senza "a capo" finali senza accorgersene.


==Espansione aritmetica intera==
== Espansione aritmetica intera ==
Permette di compiere operazioni aritmetiche tra interi, ritornando sempre una singola stringa contenente l'intero risultante. Può essere quotata, ma non cambia niente.
Permette di compiere operazioni aritmetiche tra interi, ritornando sempre una singola stringa contenente l'intero risultante. Può essere quotata, ma non cambia niente.


6 999

contributi