С в разделе 2.9.1 спецификации синтаксиса оболочки POSIX:
Каждое назначение переменной должно быть расширено для расширения тильды, расширения параметра, подстановки команд, арифметикирасширение и удаление кавычек до присвоения значения.
Разделение строк и глобализация (шаги, которые подавляют двойные кавычки) в этом списке отсутствуют.
Таким образом,кавычки излишни во всех простых присваиваниях (не говоря уже о тех, которые реализованы с аргументами declare
, export
или подобными командами), за исключением тех, где (1) желательно поведение строк в одинарных, а не в двойных кавычках;или (2) пробел или другое содержимое в значении было бы иначе проанализировано как синтаксическое, а не буквальное.
(Обратите внимание, что решение о том, как анализировать команду - таким образом, является ли оноявляется присваиванием, простой командой, составной командой или чем-то еще - происходит до раскрытия параметров, таким образом, var=$1
определяется как присвоение до того, как значение $1
когда-либо будет считаться! Если бы это было неверно, так что данные могли бы незаметно стать синтаксисом, было бы гораздо сложнее - если не невозможно - написать безопасный код, обрабатывающий ненадежные данные в bash).