Bash scripting - espansioni non quotabili: differenze tra le versioni

ampliate sezioni con più esempi
m (rimosso template autori)
(ampliate sezioni con più esempi)
Riga 63: Riga 63:
**un intervallo composto da due caratteri separati da un trattino <code>-</code>, per sostituirne uno qualsiasi dell'intervallo in base al loro valore ASCII;
**un intervallo composto da due caratteri separati da un trattino <code>-</code>, per sostituirne uno qualsiasi dell'intervallo in base al loro valore ASCII;
**un <code>!</code> iniziale per farne il complemento, ossia sostituirne uno qualsiasi non presente nella classe;
**un <code>!</code> iniziale per farne il complemento, ossia sostituirne uno qualsiasi non presente nella classe;
**il carattere <code>!</code> può essere contenuto per il suo valore letterale in una classe purché non in prima posizione, mentre <code>-</code> è considerato letteralmente soltanto in prima posizione (o seconda se dopo <code>!</code>) e in ultima posizione.
**il carattere <code>!</code> può essere contenuto per il suo valore letterale in una classe purché non in prima posizione, mentre il carattere <code>-</code> è considerato letteralmente soltanto in prima posizione (o seconda se dopo <code>!</code>) e in ultima posizione.


Se un nome di file non include il percorso assoluto (iniziante con la directory radice '''/''') o relativo (iniziante con '''./''' oppure '''../''', dalla directory corrente e da quella superiore rispettivamente), di default si assume che sia nella directory corrente. Tuttavia per evitare ambiguità con i nomi delle opzioni di alcuni comandi, in presenza di possibili nomi di file inizianti con il trattino '''-''', in particolare se la parte iniziale del file è generata dall'espansione di percorso, è sempre bene rendere esplicito il percorso relativo premettendo '''./''' al nome del file.
Se un nome di file non include il percorso assoluto (iniziante con la directory radice '''/''') o relativo (iniziante con '''./''' oppure '''../''', dalla directory corrente e da quella superiore rispettivamente), di default si assume che sia nella directory corrente. Tuttavia per evitare ambiguità con i nomi delle opzioni di alcuni comandi, in presenza di possibili nomi di file inizianti con il trattino '''-''', in particolare se la parte iniziale del file è generata dall'espansione di percorso, è sempre bene rendere esplicito il percorso relativo premettendo '''./''' al nome del file.
Riga 90: Riga 90:
   fi
   fi
done</pre>
done</pre>
Si faccia attenzione che tutti i pattern delle espansioni di percorso, e non solo quelli composti da <code>*</code>, possono generare più stringhe, anche se sostituiscono un singolo carattere in presenza di fili multipli con lo stesso prefisso e/o suffisso (per esempio il pattern ''a?c'' può espandersi alla lista ''abc aBC acc'', se esistono questi tre file).
Il pattern <code>*</code> è l'unico in grado di sostituire un numero qualsiasi di caratteri (zero o più), mentre <code>?</code> e le classi sempre e soltanto un singolo carattere. Si faccia attenzione però che tutti i pattern, e non solo quelli composti da <code>*</code>, possono generare liste di percorsi, in presenza di fili multipli con lo stesso prefisso e/o suffisso. Per esempio il pattern '''./a?c''' può espandersi alla lista ''./abc ./aBC ./acc'', se esistono questi tre file nella directory corrente (e nessun altro di tre caratteri che inizi con '''a''' e termini con '''c''').  


===Espansione di percorso con nuovi file===
===Espansione di percorso con nuovi file===
Riga 190: Riga 190:
for file in ./*.odt ./*.abw ./*.txt ./*.rtf ./*.doc; do
for file in ./*.odt ./*.abw ./*.txt ./*.rtf ./*.doc; do
</pre>
</pre>
===Differenze con l'espansione di percorso===
L'espansione di parentesi graffe:
* non è ''POSIX'', mentre l'espansione di percorso sì;
* espande delle stringhe, non ha importanza a cosa si riferiscono, mentre l'espansione di percorso si espande solo a percorsi esistenti (al tempo dell'espansione, ossia prima dell'esecuzione del comando);
* avviene per prima e può contenere altre espansioni (anche quotate, purché non siano quotate le graffe e le virgole), mentre l'espansione di percorso avviene per ultima e può solo essere il risultato di altre espansioni (se non quotate);
* ha una forma con indici di intervallo che è completamente diversa dall'intervallo permesso in una classe dell'espansione di percorso.
Riguardo l'ultimo punto si consideri per esempio <code>file{1..20}</code>: si espande alla lista (di stringhe!) ''file1 file2 ... file20'', a prescindere che esistano.<br/>
All'opposto <code>file[1-20]</code> non è possibile, nel senso che ha tutt'altro significato. Infatti l'espansione di percorso <code>[1-20]</code> significa: tutti i caratteri tra 1 e 2, e lo 0, ossia equivale alla forma (più comprensibile) <code>[0-2]</code>, perché l'intervallo è possibile solo tra due singoli caratteri all'interno di una classe. E inoltre, al solito con le espansion di percorso, <code>file[0-2]</code> sarebbe espanso ai soli file esistenti tra file0, file1 e file2, e solo se almeno uno dei tre esiste oppure resterebbe letteralmente <code>file[0-2]</code>.


[[Categoria:Bash]][[Categoria:Bash_Scripting]]
[[Categoria:Bash]][[Categoria:Bash_Scripting]]
3 581

contributi