下面的变量赋值有什么区别?
var=23
var =23
var= 23
var = 23
赋值运算符周围的空间有什么不同吗?
答案1
这很大程度上取决于外壳。如果我们只看 4 个主要的 shell 系列(Bourne、csh、rc、fish):
伯恩家族
这是 Bourne shell 及其所有变体以及ksh
, bash
, ash
/ dash
, zsh
, yash
。
var=23
:这是正确的标量变量赋值语法:由不带引号的字母、数字或下划线组成的单词,后跟=
出现在命令参数之前的不带引号的单词(这里是单独的)var =23
,var
带有=23
as 参数的命令(除了 inzsh
是=something
一个扩展为命令路径的特殊运算符something
。在这里,您可能会收到错误,因为23
不太可能是有效的命令名称)。var= 23
:赋值var=
后跟命令名称23
。这意味着传递到其环境(具有空值的环境变量)23
来执行。var=
var
var = 23
,var
命令以=
和23
作为参数。echo = 23
例如尝试一下。
ksh
、zsh
、bash
并且yash
还支持某些形式大批/列表语法变化的变量用于分配和扩展。ksh93
,zsh
并且bash
还支持关联数组3. 之间的语法ksh93
又有所不同。复合变量和类型,让人想起对象编程语言的对象和类。
切什家族
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
。在这些 shell 中,变量是数组,赋值是 with var = (foo bar)
, withvar = foo
的缩写var = (foo)
(具有一个元素的数组foo
)和var =
缩写var = ()
(没有元素的数组,使用var = ''
orvar = ('')
表示具有一个空元素的数组)。
在任何情况下,周围的空白(空格或制表符)=
都是允许的并且是可选的。因此,在这些 shell 中,这 4 个命令是等效的,相当于var = (23)
分配一个元素为 的数组23
。
鱼
在 中fish
,变量赋值语法为set var value1 value2
。与 中一样rc
,变量是数组。
因此,行为与 with 相同csh
,只是不允许您运行名称中fish
带有 a 的命令。=
如果您有这样的命令,您需要通过sh
例如:来调用它sh -c 'exec weird===cmd'
。
因此,所有var=23
andvar= 23
都会给您一个错误,var =23
将使用作为参数调用var
命令,并将使用and作为参数调用命令。=23
var = 23
var
=
23
答案2
var=23
将 23 赋给变量var
。
var =23
var
尝试使用参数运行命令(或别名或函数)=23
var = 23
同上,但论点=
和23
var= 23
将环境变量设置var
为空白字符串,然后运行命令23
是的,shell 作为一种编程语言很奇怪。但这是完全有道理的壳用于交互式使用,其中空格分隔命令和参数。大多数“特殊字符”(=
在本例中)仅在特定位置具有特殊含义,以允许命令的几乎任意参数。请参阅上述解释。
答案3
var=23
是为变量赋值的正确语法。var =23
被视为var
带有命令=23
选项/参数的命令var
(尽管参数/选项的正确/标准语法是-option
or--option
)var= 23
will 不会分配任何内容var
,因为空格会中断分配过程,并将23
被视为另一个命令。解决方法是var=\ 23
orvar=' 23'
用于存储空白。var = 23
具有与第二种情况中讨论的类似效果。实际上,这种周围空间的使用
=
通常用于测试内部条件[[ ]]
。重击示例:string1 = string2 True if the strings are equal. = should be used with the test command for POSIX conformance. When used with the [[ command, this performs pattern matching as described above (Compound Commands).
毕竟周围空白的行为=
取决于您的 shell 和编程语言。