shell 脚本中变量赋值中的空格

aja*_*jay 27 shell variable assignment

以下变量赋值有什么区别?

var=23
var =23
var= 23
var = 23
Run Code Online (Sandbox Code Playgroud)

赋值运算符周围的空间有什么不同吗?

Sté*_*las 28

这在很大程度上取决于外壳。如果我们只看 4 个主要的 shell 系列(Bourne、csh、rc、fish):

伯恩家族

那就是 Bourne shell 及其所有变体,以及ksh, bash, ash/ dash, zsh, yash.

  • var=23:这是正确的变量赋值语法:由不带引号的字母、数字或下划线组成的单词,后跟=出现在命令参数之前的不带引号的单词(这里是单独的)
  • var =23,var带有=23as 参数的命令(除了zshwhere=something是扩展到something命令路径的特殊运算符。在这里,您可能会收到错误,因为23它不太可能是有效的命令名称)。
  • var= 23:var=后跟命令名称的赋值23。这的意思执行23var=传递给它的环境(var环境变量一个空值)。
  • var = 23,var命令=23作为参数。echo = 23例如尝试。

Csh家族

cshtcsh。变量赋值有set var = value标量变量、set var = (a b)数组、setenv var value环境变量、@ var=1+1赋值和算术计算的语法。

所以:

  • var=23只是调用var=23命令。
  • var =23正在var使用=23as 参数调用命令。
  • var= 23正在var=使用23作为参数调用命令
  • var = 23正在var使用=23作为参数调用命令。

RC家族

那是rcesakanga。在这些 shell 中,变量是数组,赋值是 with var = (foo bar),withvar = foovar = (foo)(具有一个foo元素的数组)和var =for var = ()(没有元素的数组,使用var = ''var = ('')具有一个空元素的数组)的缩写。

在任何情况下,周围的空格(空格或制表符)=都是允许和可选的。因此,在这些 shell 中,这 4 个命令是等效的,并且等效var = (23)于分配一个具有一个元素的数组23.

在 中fish,变量赋值语法是set var value1 value2。像rc,变量是数组。

因此,行为将与 with 相同csh,只是fish不会让您运行=名称中带有 a 的命令。如果您有这样的命令,则需要通过sh例如以下方式调用它:sh -c 'exec weird===cmd'

所以 all var=23andvar= 23会给你一个错误,var =23var使用=23作为参数var = 23调用var命令,=并将使用和23作为参数调用命令。


von*_*and 12

var=23将 23 赋给变量var

var =23尝试var使用参数运行命令(或别名或函数)=23

var = 23同上,但论据=23

var= 23var环境变量设置为空字符串,然后运行命令23

是的,shell 作为一种编程语言很奇怪。但它作为交互式使用的外壳非常有意义,其中空格分隔命令和参数。大多数“特殊字符”(=在这种情况下)仅在特定位置具有特殊含义,以允许命令的几乎任意参数。请参阅上述解释。