为什么变量赋值中的空格在Bash中出错?

Why does a space in a variable assignment give an error in Bash?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

declare -r NUM1=5
NUM2 =4                # Line 4

num3=$((NUM1 + NUM2))
num4=$((NUM1 - NUM2))
num5=$((NUM1 * NUM2))
num6=$((NUM1 / NUM2))  # Line 9

echo"$num3"
echo $((5**2))
echo $((5%4))

我正在使用这个bash脚本,当我运行脚本时,我收到了错误

1
2
3
4
5
6
./bash_help
./bash_help: line 4: NUM2: command not found
./bash_help: line 9: NUM1 / NUM2: division by 0 (error token is"NUM2")
5
25
1

所以我已将代码更改为此,错误消失了。

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

declare -r NUM1=5
NUM2=4

num3=$((NUM1 + NUM2))
num4=$((NUM1 - NUM2))
num5=$((NUM1 * NUM2))
num6=$((NUM1 / NUM2))

echo"$num3"
echo $((5**2))
echo $((5%4))

为变量赋值时,为什么我们不能使用空格? 通常使用空格来提高代码的可读性。 有谁能解释一下?


它不是bash中的约定(或者更常见的是POSIX-family shell)。

至于"为什么",那是因为做错的各种方式都具有作为命令的有效含义。如果你使NUM2 = 4作为一个赋值,那么你不能在不引用它的情况下将=作为文字参数传递。因此,任何此类更改都将向后兼容,而不是放置在未定义的空间中(POSIX sh标准的扩展需要生存以避免违反该标准)。

1
2
3
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


在Bash中,函数作为空格分隔的单词传递参数。

从文档中

"Each operator and operand must be a separate argument."

变量赋值不同,使用此语法name=[value]

你不能在等号周围放置不带引号的空格的原因是因为bash会将其解释为命令。


原因很简单,shell的构建方式与此类似。对于具有其他编程语言经验的人来说可能没有意义(如果你将shell语法称为"语言",从某种意义上说它就是这样)。

在许多情况下,Shell脚本可以简单地不引用字符串(只要一个字符序列意味着单个字符串不包含任何间距或特殊字符)。多亏了这个,你可以写:

1
 my_command -n -X arg1 arg2

而不是(在某种虚构的伪代码中)

1
"my_command""-n""-X""arg1""arg2"

在大多数语言中,它是另一种方式:引用文字字符串,它释放"语法空间"以使用没有任何特殊字符的变量(如shell脚本中的$)。

Shell语法在频繁的情况下提供了便利,但在执行其他操作时会牺牲,便利性和可读性。这既是诅咒,也是祝福。好消息是知道如果你有一个交互式shell,你可以100%确定你有一个解释器,可以处理某种(可能是不优雅的)程序。由于其普遍可用性(尽管存在各种风味),shell是一种非常有用的平台,值得学习。