3 回答
TA贡献1772条经验 获得超5个赞
这不是bash中的约定(或更常见的是POSIX系列shell)。
至于“为什么”,这是因为各种错误的处理方式都具有作为命令的有效含义。如果您进行NUM2 = 4了赋值,那么您必须=在不加引号的情况下将其作为文字参数传递。因此,任何此类更改都将是向后不兼容的,而不是放在未定义的空间中(需要保留POSIX sh标准的扩展,以避免构成对该标准的违反)。
NUM2= 4 # runs "4" as a command, with the environment variable NUM2 set to an empty string
NUM2 =4 # runs "NUM2" as a command, with "=4" as its argument
NUM2 = 4 # runs "NUM2" as a command, with "=" as its first argument, and "4" as another
TA贡献1806条经验 获得超8个赞
在Bash中,函数以空格分隔的单词形式传递参数。
从文档中
“每个运算符和操作数必须是一个单独的参数。”
变量分配不同,并使用此语法 name=[value]
之所以不能在等号两边加上引号,是因为bash会将其解释为命令。
TA贡献1815条经验 获得超13个赞
原因很简单,shell的行为就是这样。对于具有其他编程语言经验的人来说,这可能没有任何意义(如果您将Shell语法称为“语言”,从某种意义上说就是)。
Shell脚本使在许多情况下不引号成为可能(只要是单个字符串的字符序列不包含任何空格或特殊字符)。因此,您可以编写:
my_command -n -X arg1 arg2
代替(以某种虚构的伪代码)
"my_command" "-n" "-X" "arg1" "arg2"
在大多数语言中,这是相反的方式:引用文字字符串,这可以释放“语法空间”,以使用不带任何特殊字符的变量(例如$在shell脚本中)。
Shell语法在很多情况下提供了便利,但是这样做的代价是,在做其他事情时,便利性(和可读性)降低了。这既是诅咒,又是祝福。令人高兴的是,如果您有一个交互式外壳,就可以100%确保您有一个可以处理某种(也许是不雅的)程序的解释器。由于其通用性(尽管存在各种口味),所以外壳程序是一种有用的平台,值得学习。
添加回答
举报