Bash scripting: differenze tra le versioni

dotglob e nullglob per espansioni di percorso
mNessun oggetto della modifica
(dotglob e nullglob per espansioni di percorso)
Riga 234: Riga 234:


# associo a testo il contenuto del file indicato da $file
# associo a testo il contenuto del file indicato da $file
testo=$(cat $file)    # SBAGLIATO! (se la variabile $file contiene spazi o caratteri speciali)
testo=$(cat -- $file)    # SBAGLIATO! (se la variabile $file contiene spazi o caratteri speciali)
testo=$(cat "$file")  # le virgolette attorno alla variabile sono necessarie
testo=$(cat -- "$file")  # le virgolette attorno alla variabile sono necessarie
testo="$(cat "$file")" # equivalente a sopra
testo="$(cat -- "$file")" # equivalente a sopra
</pre>
</pre>


Riga 316: Riga 316:


Sintassi (prefisso e suffisso possono essere omessi, o essere variabili da espandere):
Sintassi (prefisso e suffisso possono essere omessi, o essere variabili da espandere):
* <code>prefisso'''?'''suffisso</code> sostituisce un singolo carattere di un file, con tutti quelli possibili che combaciano con le due stringhe date;
* <code>prefisso'''?'''suffisso</code> sostituisce un singolo carattere di un file, con tutti quelli possibili che combaciano con le due stringhe date, ma di default tranne il '''.''' iniziale se manca il prefisso;
* <code>prefisso'''*'''suffisso</code> può sostituire tutti i caratteri di un file (di default tranne quelli nascosti se manca il prefisso, ossia inizianti con '''.''').
* <code>prefisso'''*'''suffisso</code> può sostituire tutti i caratteri di un file, ma di default tranne quelli nascosti se manca il prefisso (ossia quelli inizianti con '''.''').


Esempi (nella directory corrente):
Esempi (nella directory corrente):
* <code>file.???</code> si espande a tutti i file con nome "file" e con una qualsiasi estensione di tre caratteri;
* <code>file.???</code> si espande a tutti i file con nome "file" e con una qualsiasi estensione di tre caratteri;
* <code>*</code> da solo espande a tutti i file non nascosti nella directory corrente. È sempre buona norma far precedere l'asterisco da un ./, che indica la cartella corrente, se non c'è un prefisso, per impedire espansioni di file inizianti con "-", che potrebbero essere visti come opzioni da alcuni comandi;
* <code>*</code> da solo espande a tutti i file non nascosti nella directory corrente. È sempre buona norma far precedere l'asterisco da un ./, che indica la cartella corrente, se non c'è un percorso assoluto o con tilda, per impedire espansioni di file inizianti con "-", che potrebbero essere visti come opzioni da alcuni comandi;
* <code>./*</code> equivalente a <code>*</code> ma più sicuro; di seguito si userà per tutte le espansioni inizianti con <code>*</code>;
* <code>./*</code> equivalente a <code>*</code> ma più sicuro; di seguito si userà per tutte le espansioni (riguardanti la directory corrente);
* <code>"$nome"*</code>espande a tutti i file inizianti con $nome (può essere anche un percorso);
* <code>./*.txt</code> espande a tutti i file con estensione .txt;
* <code>./*.txt</code> espande a tutti i file con estensione .txt;
* <code>./*."${estensione}"</code> espande dopo aver espanso la variabile (contrariamente a ~), che può anche essere quotata;
* <code>./*."${estensione}"</code> espande dopo aver espanso la variabile (contrariamente a ~), che può anche essere quotata;
* <code>"./${nome}"*</code>espande a tutti i file inizianti con $nome;
* <code>./*/</code> espande a tutte le directory non nascoste;
* <code>./*/</code> espande a tutte le directory non nascoste;
* <code>./.*</code> espande a tutti i file nascosti (comprese "'''.'''" e "'''..'''", ossia directory corrente e superiore).
* <code>./.*</code> espande a tutti i file nascosti (comprese "'''.'''" e "'''..'''", ossia directory corrente e superiore).
Riga 332: Riga 332:


L'esistenza di file ottenuti da tali espansioni va pertanto sempre controllata, per esempio con il costrutto <code>[ -e "$file" ]</code>:
L'esistenza di file ottenuti da tali espansioni va pertanto sempre controllata, per esempio con il costrutto <code>[ -e "$file" ]</code>:
<pre>for file in ./*; do
<pre>for file in ./*; do
   if [ -e "$file" ]; then
   if [ -e "$file" ]; then
Riga 338: Riga 337:
   fi
   fi
done</pre>
done</pre>
In alternativa, il comportamento di default dell'espansione può essere cambiato (in Bash), tramite <code>shopt</code>:
* '''dotglob''' espande ai file nascosti;
* '''nullglob''' espande a "niente" se non trova nessun file con un dato pattern, rendendo superfluo il controllo sull'esistenza.
Per esempio:
<pre>
shopt -s dotglob nullglob
for file in ./*; do
  ...
done
</pre>


===Esempio: cambiare l'estensione ai file ===
===Esempio: cambiare l'estensione ai file ===
Riga 522: Riga 532:
|Verificata_da=
|Verificata_da=
:[[Utente:S3v|S3v]] (in Bash tips)
:[[Utente:S3v|S3v]] (in Bash tips)
:[[Utente:HAL 9000|HAL 9000]] 23:57, 6 lug 2014 (CEST)
:[[Utente:HAL 9000|HAL 9000]] 19:58, 9 lug 2014 (CEST)
|Estesa_da=
|Estesa_da=
:[[Utente:S3v|S3v]] (in Bash tips)
:[[Utente:S3v|S3v]] (in Bash tips)
3 581

contributi