GNU/Linux >> Linux Esercitazione >  >> Linux

$var Vs ${var} E quotare o non quotare?

posso scrivere

VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"

il risultato finale a me sembra tutto più o meno lo stesso. Perché dovrei scrivere l'uno o l'altro? qualcuno di questi non è portatile/POSIX?

Risposta accettata:

VAR=$VAR1 è una versione semplificata di VAR=${VAR1} . Ci sono cose che il secondo può fare che il primo non può, ad esempio fare riferimento a un indice di array (non portatile) o rimuovere una sottostringa (POSIX-portatile). Vedi la sezione Altro sulle variabili della Bash Guide for Beginners and Parameter Expansion nelle specifiche POSIX.

Usare le virgolette attorno a una variabile come in rm -- "$VAR1" o rm -- "${VAR}" è una buona idea. Questo rende il contenuto della variabile un'unità atomica. Se il valore della variabile contiene spazi vuoti (beh, i caratteri nel $IFS variabile speciale, spazi vuoti per impostazione predefinita) o caratteri glob e non la citi, quindi ogni parola viene considerata per la generazione del nome file (globbing) la cui espansione fornisce tanti argomenti a qualsiasi cosa tu stia facendo.

$ find .
.
./*r*
./-rf
./another
./filename
./spaced filename
./another spaced filename
./another spaced filename/x
$ var='spaced filename'
# usually, 'spaced filename' would come from the output of some command and you weren't expecting it
$ rm $var
rm: cannot remove 'spaced': No such file or directory
# oops! I just ran 'rm spaced filename'
$ var='*r*'
$ rm $var
# expands to: 'rm' '-rf' '*r*' 'another spaced filename'

$ find .
.
./another
./spaced filename
./another spaced filename
$ var='another spaced filename'
$ rm -- "$var"
$ find .
.
./another
./spaced filename

Sulla portabilità:
Secondo POSIX.1-2008 sezione 2.6.2, le parentesi graffe sono facoltative.


Linux
  1. Linux – Perché usiamo Su – e non solo Su?

  2. "nohup Sudo ..." non richiede Passwd e non fa nulla?

  3. Il pacchetto che ho appena installato è legittimo e, in caso contrario, come disinstallarlo?

  4. Perché è Rm -rf e non Rmdir -rf?

  5. Come eseguire il comando "trova" solo sulla directory corrente e non sulle sottodirectory

Come scoprire se un pacchetto è installato o meno in Linux e Unix

La differenza tra un comando integrato e uno che non lo è?

Ubuntu 17.10 Blocco schermo non funzionante e grigio?

Differenza tra virgolette singole e doppie in Bash Shell

Firefox ha cambiato il flusso di lavoro di download e non sono un fan

Perché il mio crontab non funziona e come posso risolverlo?