например
if [ "$FOO" = "true" ]; then
против
if [ $FOO = "true" ]; then
Чем отличается? Кажется, оба заявления также работают.
bash
shell
shell-script
quoting
Райан
источник
источник
a='foo bar'; [[ $a == "foo bar" ]]
. Однако, переменная , которая не содержит Глоб символы не должны быть:[[ $a == $a ]]
. Расширение слова не выполняется в двойных квадратных скобках. А для сопоставления с регулярным выражением шаблон с правой стороны не должен заключаться в кавычки, иначе он будет восприниматься как буквальная строка:[[ $a =~ .*oo.*r ]]
(однако шаблон должен быть в переменной без кавычек, вместо этого ...[[ $a == foo* ]]
. Можете ли вы предоставить какие-либо дополнительные примеры требования для цитирования помимо моего примера с литеральной строкой?Ответы:
Если значение
$FOO
представляет собой одно слово, которое не содержит подстановочный знак\[*?
, тогда оба идентичных.Если
$FOO
не назначено, или пусто, или более чем одно слово (то есть содержит пробел или$IFS
), то версия без кавычек является синтаксической ошибкой. Если это просто правильная последовательность слов (например,0 -eq 0 -o false
), результат может быть произвольным. Поэтому рекомендуется всегда заключать в кавычки переменные в сценариях оболочки.Кстати,
"true"
цитировать не нужно.источник
Чтобы проиллюстрировать, какие проблемы это может вызвать, приведу несколько примеров.
Допустим, у нас есть две переменные следующим образом:
Теперь у нас есть две переменные, содержащие точно одну строку / значение. Если мы сделали несколько операторов if для проверки результата, в вашем случае:
В этот момент вы получите
bash: [: too many arguments
. $ FOO без кавычек теперь имеет три значения, а именно'[ , some , value'
.[
Ключевое слово test не знает, что выполнять, поскольку ожидает, что первый или второй аргумент будет оператором.Когда мы заключаем в кавычки «$ FOO», мы явно говорим,
if
чтобы посмотреть на правильные значения, где не происходит разбиение слов.Другой пример:
rm $my_file
означает удалить 'A' 'random' 'file.txt', что делает его тремя файлами.rm "$my_file"
будет удален «Случайный файл.txt», который создает один файл.Надеюсь, я не перепутал вас с этими примерами.
источник
В этом конкретном случае нет никакой разницы.
Однако, если он
$FOO
содержит пробел или некоторые специальные символы, у вас возникнут проблемы.В этом
"$FOO"
случае, он будет использовать переменную в целом, чтобы сделать совпадение, защищающее вас от проблемы пространства.Однако, если вы используете
$FOO
и есть особый случай, это повлияет на оператор if.источник