6 999
contributi
m (→Con lista di stringhe: rimosso prompt e modifiche (solo) stilistiche) |
S3v (discussione | contributi) mNessun oggetto della modifica |
||
Riga 1: | Riga 1: | ||
{{Bash_scripting}} | {{Bash_scripting}} | ||
__TOC__ | |||
Le espansioni trattate nelle sezioni successive avvengono unicamente in stringhe non quotate, almeno limitatamente ai caratteri speciali che le attivano, e sono attivabili soltanto da caratteri diversi dal '''$'''. | Le espansioni trattate nelle sezioni successive avvengono unicamente in stringhe non quotate, almeno limitatamente ai caratteri speciali che le attivano, e sono attivabili soltanto da caratteri diversi dal '''$'''. | ||
Riga 7: | Riga 7: | ||
Inoltre l'espansione di tilde, che è sempre espansa in una singola stringa, è l'unica possibile in un'assegnazione tra le espansioni non quotabili. | Inoltre l'espansione di tilde, che è sempre espansa in una singola stringa, è l'unica possibile in un'assegnazione tra le espansioni non quotabili. | ||
==Espansione di tilde== | == Espansione di tilde == | ||
Sintassi: | Sintassi: | ||
* <code>~</code> (per digitarlo con tastiera con layout italiano: <code>Ctrl-ì</code>) si espande alla home, se non è quotata (equivalente all'uso di ${HOME}, che può essere quotata); | * <code>~</code> (per digitarlo con tastiera con layout italiano: <code>Ctrl-ì</code>) si espande alla home, se non è quotata (equivalente all'uso di ${HOME}, che può essere quotata); | ||
Riga 40: | Riga 40: | ||
Si noti che il percorso può anche non esistere, infatti soltanto le stringhe <code>~/</code> e <code>~utente/</code> sono espanse. Non è infatti un'espansione di percorso. | Si noti che il percorso può anche non esistere, infatti soltanto le stringhe <code>~/</code> e <code>~utente/</code> sono espanse. Non è infatti un'espansione di percorso. | ||
==Espansione di percorso== | == Espansione di percorso == | ||
{{Box | File | Su Unix e Unix-like per file si può intendere sia un file regolare, ma anche una directory, un link simbolico, una pipe, un socket, un device, ecc... | {{Box | File | Su Unix e Unix-like per file si può intendere sia un file regolare, ma anche una directory, un link simbolico, una pipe, un socket, un device, ecc... | ||
Riga 81: | Riga 81: | ||
* '''[:ascii:]''', per tutti i caratteri ASCII da 0 a 127, ed è equivalente alle due classi '''[:print:]''' e '''[:cntrl:]'''. | * '''[:ascii:]''', per tutti i caratteri ASCII da 0 a 127, ed è equivalente alle due classi '''[:print:]''' e '''[:cntrl:]'''. | ||
===Esempi di espansioni di percorso=== | === Esempi di espansioni di percorso === | ||
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 99: | Riga 99: | ||
* <code>./.[!.]*</code> espande a tutti i file nascosti di almeno due caratteri in cui il secondo non è un punto (non espande a '''.''' e '''..''', ma nemmeno a possibili file nascosti inizianti con '''..'''); | * <code>./.[!.]*</code> espande a tutti i file nascosti di almeno due caratteri in cui il secondo non è un punto (non espande a '''.''' e '''..''', ma nemmeno a possibili file nascosti inizianti con '''..'''); | ||
* <code>./..?*</code> espande a tutti i file nascosti di almeno tre caratteri in cui il secondo è un punto (tutti i file nascosti saltati dal precedente, ma sempre escludendo '''.''' e '''..'''); | * <code>./..?*</code> espande a tutti i file nascosti di almeno tre caratteri in cui il secondo è un punto (tutti i file nascosti saltati dal precedente, ma sempre escludendo '''.''' e '''..'''); | ||
* <code>./.[!.]* ./..?*</code> espande a tutti i file nascosti, esclusi '''.''' e '''..''' ( | * <code>./.[!.]* ./..?*</code> espande a tutti i file nascosti, esclusi '''.''' e '''..''' ([[POSIX]]). | ||
È importante sapere che, se nessun file combacia con un dato pattern, allora l'espansione '''non''' viene effettuata e i caratteri mantengono il loro valore letterale. E inoltre <code>*</code>, <code>?</code>, <code>[</code> e <code>]</code> sono caratteri validi per un nome di file. | È importante sapere che, se nessun file combacia con un dato pattern, allora l'espansione '''non''' viene effettuata e i caratteri mantengono il loro valore letterale. E inoltre <code>*</code>, <code>?</code>, <code>[</code> e <code>]</code> sono caratteri validi per un nome di file. | ||
Riga 111: | Riga 111: | ||
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'''). | 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 === | ||
L'espansione di percorso può fallire anche se non trova corrispondenze nella parte non riguardante i caratteri speciali, perché i caratteri speciali sono espansi in funzione di tutta la stringa. Questo significa che deve esistere il risultato dell'espansione, considerando il percorso nella sua interezza, prima dell'esecuzione di un qualsiasi comando. | L'espansione di percorso può fallire anche se non trova corrispondenze nella parte non riguardante i caratteri speciali, perché i caratteri speciali sono espansi in funzione di tutta la stringa. Questo significa che deve esistere il risultato dell'espansione, considerando il percorso nella sua interezza, prima dell'esecuzione di un qualsiasi comando. | ||
Riga 142: | Riga 142: | ||
</pre> | </pre> | ||
===Cambiare i risultati dell'espansione=== | === Cambiare i risultati dell'espansione === | ||
Il comportamento di default dell'espansione può essere cambiato in bash (non ''POSIX''), tramite <code>shopt -s</code> (''set''): | Il comportamento di default dell'espansione può essere cambiato in bash (non ''POSIX''), tramite <code>shopt -s</code> (''set''): | ||
* '''nullglob''' espande a "niente" se non trova nessun file con un dato pattern, rendendo superfluo il controllo sull'esistenza; | * '''nullglob''' espande a "niente" se non trova nessun file con un dato pattern, rendendo superfluo il controllo sull'esistenza; | ||
Riga 157: | Riga 157: | ||
Per disabilitare un'opzione, ripristinando il default, si può utilizzare <code>shopt -u</code> (''unset''). | Per disabilitare un'opzione, ripristinando il default, si può utilizzare <code>shopt -u</code> (''unset''). | ||
===Esempio: cambiare l'estensione ai file regolari=== | === Esempio: cambiare l'estensione ai file regolari === | ||
Rinomina tutti i file regolari <code>*.txt</code> della directory corrente in <code>*.log</code>, tramite il comando esterno <code>mv</code>: | Rinomina tutti i file regolari <code>*.txt</code> della directory corrente in <code>*.log</code>, tramite il comando esterno <code>mv</code>: | ||
Riga 170: | Riga 170: | ||
Si noti che utilizzando <code>[ '''-f''' ... ]</code> in luogo di <code>[ '''-e''' ... ]</code>, si saltano anche tutti i file che non sono regolari, e che potrebbero essere restituiti dall'espansione di percorso. | Si noti che utilizzando <code>[ '''-f''' ... ]</code> in luogo di <code>[ '''-e''' ... ]</code>, si saltano anche tutti i file che non sono regolari, e che potrebbero essere restituiti dall'espansione di percorso. | ||
==Espansione di parentesi (graffa)== | == Espansione di parentesi (graffa) == | ||
In '''bash''' (non ''POSIX'') se i caratteri <code>{</code> e <code>}</code> non sono quotati, e non sono preceduti dal carattere di escape <code>\</code>, possono essere espansi con due diverse sintassi per generare una lista di stringhe. E più espansioni di parentesi possono essere annidate. | In '''bash''' (non ''POSIX'') se i caratteri <code>{</code> e <code>}</code> non sono quotati, e non sono preceduti dal carattere di escape <code>\</code>, possono essere espansi con due diverse sintassi per generare una lista di stringhe. E più espansioni di parentesi possono essere annidate. | ||
Questa espansione avviene prima di tutte le altre, e il risultato può passare per tutte le altre espansioni. Non può avvenire in un'assegnazione, se non all'interno di altre espansioni. | Questa espansione avviene prima di tutte le altre, e il risultato può passare per tutte le altre espansioni. Non può avvenire in un'assegnazione, se non all'interno di altre espansioni. | ||
===Con indici di intervallo=== | === Con indici di intervallo === | ||
Sintassi: <code>prefisso{x..y[..z]}suffisso</code> | Sintassi: <code>prefisso{x..y[..z]}suffisso</code> | ||
Riga 192: | Riga 192: | ||
</pre> | </pre> | ||
===Con lista di stringhe=== | === Con lista di stringhe === | ||
Sintassi: <code>prefisso{stringa1,stringa2,...}suffisso</code> | Sintassi: <code>prefisso{stringa1,stringa2,...}suffisso</code> | ||
Riga 220: | Riga 220: | ||
senza bisogno di spostarsi dalla directory corrente. E lo stesso si applica a <code>mv</code> per spostare o rinominare un file. | senza bisogno di spostarsi dalla directory corrente. E lo stesso si applica a <code>mv</code> per spostare o rinominare un file. | ||
===Differenze con l'espansione di percorso=== | === Differenze con l'espansione di percorso === | ||
L'espansione di parentesi graffe: | L'espansione di parentesi graffe: | ||
* non è ''POSIX'', mentre l'espansione di percorso sì; | * non è ''POSIX'', mentre l'espansione di percorso sì; | ||
Riga 228: | Riga 228: | ||
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/> | 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 | 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 espansioni 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]] |
contributi