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

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

下面的变量赋值有什么区别?

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 =23var带有=23as 参数的命令(除了 inzsh=something一个扩展为命令路径的特殊运算符something。在这里,您可能会收到错误,因为23不太可能是有效的命令名称)。
  • var= 23:赋值var=后跟命令名称23。这意味着传递到其环境(具有空值的环境变量)23来执行。var=var
  • var = 23,var命令以=23作为参数。echo = 23例如尝试一下。

kshzshbash并且yash还支持某些形式大批/列表语法变化的变量用于分配和扩展。ksh93zsh并且bash还支持关联数组3. 之间的语法ksh93又有所不同。复合变量类型,让人想起对象编程语言的对象和类。

切什家族

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), 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=23andvar= 23都会给您一个错误,var =23将使用作为参数调用var命令,并将使用and作为参数调用命令。=23var = 23var=23

答案2

var=23将 23 赋给变量var

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

var = 23同上,但论点=23

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

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

答案3

  • var=23是为变量赋值的正确语法。
  • var =23被视为var带有命令=23选项/参数的命令var(尽管参数/选项的正确/标准语法是-optionor --option
  • var= 23will 不会分配任何内容var,因为空格会中断分配过程,并将23被视为另一个命令。解决方法是var=\ 23orvar=' 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 和编程语言。

相关内容