为什么变量赋值中的 space 会在 Bash 中出错?

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

#!/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 脚本,当我是 运行 这个脚本时,我得到了错误

./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

所以我把代码改成了这个,错误消失了。

#!/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)中的约定。

至于"why",那是因为各种错误的做法都具有作为命令的有效含义。如果您对 NUM2 = 4 进行了赋值,那么您无法在不引用的情况下将 = 作为文字参数传递。 因此,任何此类更改都将是 backwards-incompatible,而不是放置在未定义的 space 中(其中 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

在 Bash 中,函数以空格分隔的单词形式传递参数。

来自文档

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

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

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

原因很简单,shell 就是为了这样的行为而构建的。对于具有其他编程语言经验的人来说,这可能没有意义(如果您将 shell 语法称为 "language",在某种意义上它是)。

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

 my_command -n -X arg1 arg2

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

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

在大多数语言中,情况恰恰相反:文字字符串被引用,这使 "syntax space" 可以使用没有任何特殊字符的变量(如 shell 脚本中的 $) .

Shell 语法在常见情况下提供便利,但代价是在做其他事情时不太方便(和可读性)。这既是诅咒也是祝福。好处是知道如果你有一个交互式 shell,你可以 100% 确定你有一个解释器可以处理某种(可能不优雅的)程序。由于其普遍可用性(尽管存在各种风格),shell 是一种非常有用的平台,值得学习。