Вы всегда можете показать эффект цитирования переменной с помощью printf
.
Разделение слов сделано на var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
цитируется, так что без слов
$ printf '[%s]\n' "$var1"
[hello world]
Разделение слов var1
внутри $()
, эквивалентно echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
Нет слов для разделения var1
, нет проблем с не цитированием $()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
var1
Снова разделение слов :
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
Цитируя оба, самый простой способ быть уверенным.
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
Глобинговая проблема
Отсутствие кавычки в переменной также может привести к глобальному расширению ее содержимого:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Обратите внимание, что это происходит только после раскрытия переменной. Нет необходимости указывать глобус во время присваивания:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Используйте, set -f
чтобы отключить это поведение:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
И set +f
чтобы снова включить его:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]