Shell脚本中变量分配中的空格


17

以下变量分配之间有什么区别?

var=23
var =23
var= 23
var = 23

赋值运算符周围的空间是否有差异?


在大多数编程语言中,这根本没有什么区别……实际上是否有区别呢?您还在这里谈论过往学校吗?不是ash / zsh / bash或其他新事物?
Cestarian

仅第一个示例设置变量。
DisplayName

那么,最后3个语句是否会抛出语法错误?还是它们真正具有意义?
Cestarian '16

2
@Cestarian他们意味着什么,如果你有一个叫做命令var,然后var =23将通=23到VAR,并var = 23会通过=,并23于VAR。或者,如果您有一个调用的命令,var=那么var= 23它将传递23给该命令var=
DisplayName 2013年

1
@Cestarian替换为bash,与sh四种情况完全相同。
pfnuesel

Answers:


14

这很大程度上取决于外壳。如果仅查看4个主要的shell家族(Bourne,csh,rc,fish):

伯恩家族

这是Bourne shell和它的所有变体和kshbashash/ dashzshyash

  • var=23:这是正确的变量赋值语法:一个单词,该单词由无引号的字母,数字或下划线组成,后跟一个无引号=,出现在命令参数前(此处是独立的)
  • var =23var带有=23as参数的命令(除非zshwhere =something是扩展到something命令路径的特殊运算符。在这里,您很可能会收到错误,因为23它不太可能是有效的命令名)。
  • var= 23:分配var=后跟命令名称23。这意味着要执行23并将var=其传递到其环境(var具有空值的环境变量)。
  • var = 23var使用=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使用=23作为参数调用命令。
  • var= 23正在var=使用23作为参数调用命令
  • var = 23正在var使用=23作为参数调用命令。

RC家族

那是rcesakanga。在这些shell中,变量是数组,赋值是with var = (foo bar)var = foo它们的简称var = (foo)(一个foo元素一个数组)和(不包含元素的数组,包含一个空元素的数组)的var =简称。var = ()var = ''

在任何情况下,=都允许使用空格(制表符或空格)或空格。因此,在这些shell中,这4条命令是等效的,并且等效var = (23)于分配一个元素为的数组23

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

因此,其行为与相同csh,除了fish不会让您运行名称为的命令=。如果您有这样的命令,则需要通过sh例如调用它sh -c 'exec weird===cmd'

因此,所有的var=23var= 23给你一个错误,var =23将调用var命令=23作为参数,var = 23将调用var与命令=23作为参数。


8

var=23将23分配给变量var

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

var = 23同上,但论点=23

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

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


3
  • var=23 是将值分配给变量的正确语法。
  • var =23被视为var带有命令=23选项/自变量的命令var(尽管参数/选项的正确/标准语法为-option--option
  • var= 23不会分配任何内容,var因为空格会中断分配过程,23并将其视为另一个命令。解决方法是var=\ 23var=' 23'用于存储空白。
  • var = 23具有与第二种情况相同的效果。

    实际上,这种周围空间的使用=方式通常用于内部测试条件中[[ ]]。Bash示例:

    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和编程语言。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.