Puoi sempre mostrare gli effetti della quotazione delle variabili con printf
.
Suddivisione delle parole eseguita su var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
citato, quindi nessuna suddivisione delle parole:
$ printf '[%s]\n' "$var1"
[hello world]
Scissione di parole var1
all'interno $()
, equivalente a echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
Nessuna suddivisione in parole var1
, nessun problema con la mancata citazione di $()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
Ripartizione della parola var1
:
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
Citando entrambi, il modo più semplice per essere sicuri.
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
Problema globale
Non quotare una variabile può anche portare all'espansione globale dei suoi contenuti:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Si noti che ciò si verifica solo dopo l'espansione della variabile. Non è necessario citare un glob durante l'assegnazione:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Utilizzare set -f
per disabilitare questo comportamento:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
E set +f
per riattivarlo:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]