В чем разница между назначениями переменных ниже?
var=23
var =23
var= 23
var = 23
Есть ли разница в пространстве вокруг оператора присваивания?
shell
variable
assignment
Аджай
источник
источник
var
тоvar =23
она будет передана=23
в var, иvar = 23
будет передана=
и23
в var. Или, если у вас есть вызванная команда,var=
тогдаvar= 23
передайте23
командуvar=
.bash
, что делает то же самое, что иsh
во всех четырех случаях.Ответы:
Это очень зависит от оболочки. Если мы рассмотрим только 4 основных семейства раковин (Bourne, csh, rc, fish):
Семья Борн
Это Bourne оболочки и все его варианты и
ksh
,bash
,ash
/dash
,zsh
,yash
.var=23
: это правильный синтаксис присваивания переменной: слово, которое состоит из букв без кавычек, цифр или подчеркиваний, за которыми следует символ без кавычек,=
который появляется перед аргументом команды (здесь он сам по себе)var =23
, Тоvar
команда с в=23
качестве аргумента ( за исключением ,zsh
когда=something
это специальный оператор , который расширяется на путиsomething
команды. Здесь, вы бы , вероятно, получите ошибку , как23
вряд ли будет действительным именем команды).var= 23
: назначение,var=
за которым следует имя команды23
. Это предназначено для выполнения23
сvar=
переданным в его окружение (var
переменная окружения с пустым значением).var = 23
,var
Команда с=
и в23
качестве аргумента. Попробуйте,echo = 23
например.Csh семья
csh
иtcsh
. Переменные присваиваются с использованиемset var = value
синтаксиса для скалярных переменных,set var = (a b)
для массивов,setenv var value
для переменных среды,@ var=1+1
для присваивания и арифметической оценки.Так:
var=23
просто вызываетvar=23
команду.var =23
вызываетvar
команду в=23
качестве аргумента.var= 23
вызываетvar=
команду в23
качестве аргументаvar = 23
вызываетvar
команду с=
и в23
качестве аргументов.Rc семья
Вот
rc
,es
иakanga
. В этих оболочках переменные - это массивы, и присваивания имеютvar = (foo bar)
, сvar = foo
сокращениемvar = (foo)
(массив с однимfoo
элементом) иvar =
сокращениемvar = ()
(массив без элемента, используйтеvar = ''
для массива с одним пустым элементом).В любом случае, пробелы (пробел или табуляция) вокруг
=
допустимы и необязательны. Таким образом, в этих оболочках эти 4 команды эквивалентны и эквивалентныvar = (23)
назначению массива с одним элементом23
.Рыбы
В
fish
, синтаксис присваивания переменной естьset var value1 value2
. Как и вrc
, переменные являются массивами.Таким образом, поведение будет таким же, как с
csh
, за исключением того, чтоfish
вы не сможете запустить команду с=
именем в имени. Если у вас есть такая команда есть, вам нужно вызвать его с помощьюsh
, например:sh -c 'exec weird===cmd'
.Так все
var=23
иvar= 23
даст вам ошибку,var =23
будет вызыватьvar
команду с в=23
качестве аргумента иvar = 23
будет вызыватьvar
команду с=
и в23
качестве аргументов.источник
var=23
присваивает 23 переменнойvar
.var =23
пытается выполнить команду (или псевдоним, или функцию)var
с аргументом=23
var = 23
То же самое, но аргументы=
и23
var= 23
устанавливаетvar
переменную окружения в пустую строку, затем запускает команду23
Да, оболочка странная как язык программирования. Но это имеет смысл в качестве оболочки для интерактивного использования, где пробелы разделяют команды и аргументы. Большинство «специальных символов» (
=
в данном случае) имеют специальное значение только в определенных позициях, чтобы допускать почти произвольные аргументы для команд. См. Приведенные выше интерпретации.источник
var=23
правильный синтаксис для присвоения значения переменной.var =23
рассматривается как командаvar
с=23
опцией / аргументом для командыvar
(хотя правильный / стандартный синтаксис для аргумента / опции --option
или--option
)var= 23
не будет назначать ничего,var
поскольку пробел нарушает процесс назначения и23
будет рассматриваться как другая команда. Обходной путьvar=\ 23
илиvar=' 23'
для хранения пробела.var = 23
имеет эффект, аналогичный описанному во втором случае.На самом деле этот тип использования пространства вокруг
=
обычно используется в условиях тестирования внутри[[ ]]
. Пример для Bash:И в конце концов поведение пустого пространства вокруг
=
зависит от вашей оболочки и языков программирования.источник