猿问

为什么变量分配中的空格会导致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)) 

当我们给变量赋值时为什么不能使用空格?习惯上使用空格以提高代码的可读性。谁能解释一下?


江户川乱折腾
浏览 550回答 3
3回答

月关宝盒

这不是bash中的约定(或更常见的是POSIX系列shell)。至于“为什么”,这是因为各种错误的处理方式都具有作为命令的有效含义。如果您进行NUM2 = 4了赋值,那么您必须=在不加引号的情况下将其作为文字参数传递。因此,任何此类更改都将是向后不兼容的,而不是放在未定义的空间中(需要保留POSIX sh标准的扩展,以避免构成对该标准的违反)。NUM2= 4 # runs "4" as a command, with the environment variable NUM2 set to an empty stringNUM2 =4 # runs "NUM2" as a command, with "=4" as its argumentNUM2 = 4 # runs "NUM2" as a command, with "=" as its first argument, and "4" as another

慕森卡

在Bash中,函数以空格分隔的单词形式传递参数。从文档中“每个运算符和操作数必须是一个单独的参数。”变量分配不同,并使用此语法 name=[value]之所以不能在等号两边加上引号,是因为bash会将其解释为命令。

萧十郎

原因很简单,shell的行为就是这样。对于具有其他编程语言经验的人来说,这可能没有任何意义(如果您将Shell语法称为“语言”,从某种意义上说就是)。Shell脚本使在许多情况下不引号成为可能(只要是单个字符串的字符序列不包含任何空格或特殊字符)。因此,您可以编写: my_command -n -X arg1 arg2代替(以某种虚构的伪代码) "my_command" "-n" "-X" "arg1" "arg2"在大多数语言中,这是相反的方式:引用文字字符串,这可以释放“语法空间”,以使用不带任何特殊字符的变量(例如$在shell脚本中)。Shell语法在很多情况下提供了便利,但是这样做的代价是,在做其他事情时,便利性(和可读性)降低了。这既是诅咒,又是祝福。令人高兴的是,如果您有一个交互式外壳,就可以100%确保您有一个可以处理某种(也许是不雅的)程序的解释器。由于其通用性(尽管存在各种口味),所以外壳程序是一种有用的平台,值得学习。
随时随地看视频慕课网APP
我要回答