Bash tips: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
(aggiunto debug integrato)
mNessun oggetto della modifica
Riga 191: Riga 191:
Il contenuto di una variabile si accede con <code>${nome}</code> oppure con la forma abbreviata <code>$nome</code>.
Il contenuto di una variabile si accede con <code>${nome}</code> oppure con la forma abbreviata <code>$nome</code>.


Si noti che la forma abbreviata considera il nome della variabile come composto da tutti i caratteri validi incontrati. Per esempio <code>"$nome$cognome"</code> è equivalente a <code>"${nome}${cognome}"</code>, ma <code>"$nome_$cognome"</code> non lo è a <code>"${nome}_${cognome}"</code> perché <code>nome_</code> (con underscore finale) sarebbe un nome di variabile valido. In caso di concatenazione di variabili è preferibile accedere alle variabili con le graffe, o in alternativa (meno elegante) delimitarle dalle virgolette o da un carattere '''\''' posto dopo il nome; infatti <code>"$nome"_"$cognome"</code> e <code>"$nome\_$cognome"</code> corrispondono a <code>"${nome}_${cognome}"</code>.
Si noti che la forma abbreviata considera il nome della variabile come composto da tutti i caratteri validi incontrati. Per esempio <code>"$nome$cognome"</code> è equivalente a <code>"${nome}${cognome}"</code>, ma <code>"$nome_$cognome"</code> non lo è a <code>"${nome}_${cognome}"</code> perché <code>nome_</code> (con underscore finale) sarebbe un nome di variabile valido. In caso di concatenazione di variabili è preferibile accedere alle variabili con le graffe, o in alternativa (meno elegante) delimitarle dalle virgolette; infatti <code>"$nome"_"$cognome"</code> corrisponde a <code>"${nome}_${cognome}"</code>.


Nelle assegnazioni non si deve usare il <code>'''$'''</code>, salvo che per accedere al contenuto di altre variabili. Ed è superfluo anche l'uso delle virgolette, salvo concatenazioni e spazi in cui è preferibile assieme all'uso delle graffe:
Nelle assegnazioni non si deve usare il <code>'''$'''</code>, salvo che per accedere al contenuto di altre variabili. Ed è superfluo anche l'uso delle virgolette, salvo concatenazioni e spazi in cui è preferibile assieme all'uso delle graffe:
Riga 203: Riga 203:
È bene notare che in tutti gli altri casi, quando si accede al contenuto di una variabile senza quotarla, questa può essere trasformata in più di una singola stringa, in base agli spazi contenuti, e perfino in "niente" se è vuota ("niente" proprio come se non presente nel codice). Se si vuole sempre considerare il contenuto della variabile come una singola stringa, è necessario accederla quotata (tra virgolette), ossia con <code>"$variabile"</code> oppure <code>"${variabile}"</code>.
È bene notare che in tutti gli altri casi, quando si accede al contenuto di una variabile senza quotarla, questa può essere trasformata in più di una singola stringa, in base agli spazi contenuti, e perfino in "niente" se è vuota ("niente" proprio come se non presente nel codice). Se si vuole sempre considerare il contenuto della variabile come una singola stringa, è necessario accederla quotata (tra virgolette), ossia con <code>"$variabile"</code> oppure <code>"${variabile}"</code>.


Questo fatto è di particolare importanza, e una comune sorgente di errori, quando si utilizza la variabile in una condizione (<code>[ ... ]</code>, <code>test ...</code>, ecc...), perché la variabile potrebbe essere sostituita da più di una stringa o perfino da nessuna; e anche quando la si passa a un comando, in particolare se agisce su un file indicato dalla variabile, che potrebbe venir trattato come una lista di file se il nome contiene spazi (cosa molto comune per i file degli utenti). D'altra parte l'utilità di accedere una variabile senza quotarla consiste nella possibilità di assegnare tutte le opzioni da passare a un comando, se sono stringhe senza spazi, a una singola variabile, così da passare al comando tutte le stringhe (o nessuna stringa se lasciata vuota) in una volta sola.
Questo fatto è di particolare importanza, e una comune sorgente di errori, quando si utilizza la variabile in una condizione (<code>[ ... ]</code>, <code>test ...</code>, ecc...), perché la variabile potrebbe essere sostituita da più di una stringa o perfino da nessuna; e anche quando la si passa a un comando, in particolare se agisce su un file indicato dalla variabile, che potrebbe venir trattato come una lista di file se il nome contiene spazi (cosa molto comune per i file degli utenti). <br/>
Esempio di codice che crea un backup di un file indicato da una variabile, se il suo nome non termina già con estensione .bak. Si notino le virgolette attorno alla variabili, omesse solo nelle assegnazioni (senza spazi), per garantire che ogni variabile venga espansa in uno e un solo argomento:
<pre> if [ "$file" = "${file%.bak}" ]; then
    oldfile=$file
    file=${file}.bak
    cp -- "$oldfile" "$file"
fi
</pre>
 
D'altra parte accedere una variabile senza quotarla permette di assegnare tutte le opzioni da passare a un comando, se sono stringhe senza spazi, alla variabile per poi accederle in una volta sola:
 
<pre>ARGUMENTS="" # nell'intestazione del file, solo opzioni senza spazi
...
comando $ARGUMENTS # la variabile, non quotata, può essere vuota (come non scritta) o essere espansa in uno o più argomenti
</pre>
 
Si noti invece che usando <code>"$ARGUMENT"</code> (quotata) per una variabile contenente la stringa vuota, il comando leggerebbe lo stesso un argomento e potrebbe fallire.


=== Manipolazione delle stringhe ===
=== Manipolazione delle stringhe ===
Riga 319: Riga 335:
  $ for f in *.txt; do mv -- "$f" "${f/%txt/log}"; done
  $ for f in *.txt; do mv -- "$f" "${f/%txt/log}"; done


L'opzione "--" dopo il comando esterno <code>mv</code> serve per comunicargli che le stringhe che seguono non sono opzioni, nemmeno se iniziassero con il carattere "-". È sempre buona norma utilizzarla con comandi che manipolano i file, quali <code>rm</code>, <code>cp</code>, <code>mv</code>, ecc...
{{Suggerimento | L'opzione "--" dopo il comando esterno <code>mv</code> serve per comunicargli che le stringhe che seguono non sono opzioni, nemmeno se iniziassero con il carattere "-". È sempre buona norma utilizzarla con comandi che accettano file come argomenti, il cui nome non è noto a priori, in particolare per comandi che manipolano i file, come: <code>rm</code>, <code>cp</code>, <code>mv</code>, ecc... <br/>
L'opzione deve essere supportata dal comando esterno, non è trattata specialmente dalla shell.}}


=== Debug integrato ===
=== Debug integrato ===
Riga 367: Riga 384:
# seleziona, apri file, incolla, salva: noioso
# seleziona, apri file, incolla, salva: noioso
# quota il tutto e appendi ad un file con echo: già meglio
# quota il tutto e appendi ad un file con echo: già meglio
# in modalità ''Emacs'' (il default) <code>'''CTRL-x''' <code>'''CTRL-e'''</code>, si apre il nostro editor di fiducia e salviamo: superbo; mentre se si utilizza la modalità ''vi'' è sufficiente premere il tasto '''v''' in modalità comando
# in modalità ''Emacs'' (il default) <code>'''CTRL-x'''</code> <code>'''CTRL-e'''</code>, si apre il nostro editor di fiducia e salviamo: superbo; mentre se si utilizza la modalità ''vi'' è sufficiente premere il tasto '''v''' in modalità comando


===Processo in background===
===Processo in background===
Riga 434: Riga 451:
  $ help bind
  $ help bind


Un altro comando utile, per sapere che cosa verrà eseguito con un dato comando (un alias, una funzione, un comando interno, oppure un eseguibile esterno e in che percorso), e anche se esiste qualcosa da eseguire con quel nome:
Un altro comando utile, per sapere se esiste qualcosa da eseguire con un dato nome, e in caso che cosa verrà eseguito: un alias, una funzione, un comando interno della shell, oppure un eseguibile esterno (e in che percorso). La sintassi:
  $ type comando-da-cercare
  $ type comando-da-cercare