为了账号安全,请及时绑定邮箱和手机立即绑定

为什么变量分配中的空格会导致Bash错误?

为什么变量分配中的空格会导致Bash错误?

#!/bin/bashdeclare -r NUM1=5NUM2 =4                # Line 4num3=$((NUM1 + NUM2))num4=$((NUM1 - NUM2))num5=$((NUM1 * NUM2))num6=$((NUM1 / NUM2))  # Line 9echo "$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")5251所以我将代码更改为此,错误消失了。#!/bin/bashdeclare -r NUM1=5NUM2=4num3=$((NUM1 + NUM2))num4=$((NUM1 - NUM2))num5=$((NUM1 * NUM2))num6=$((NUM1 / NUM2))echo "$num3"echo $((5**2))echo $((5%4)) 当我们给变量赋值时为什么不能使用空格?习惯上使用空格以提高代码的可读性。谁能解释一下?
查看完整描述

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


查看完整回答
反对 回复 2019-11-04
?
慕森卡

TA贡献1806条经验 获得超8个赞

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


从文档中


“每个运算符和操作数必须是一个单独的参数。”


变量分配不同,并使用此语法 name=[value]


之所以不能在等号两边加上引号,是因为bash会将其解释为命令。


查看完整回答
反对 回复 2019-11-04
?
萧十郎

TA贡献1815条经验 获得超13个赞

原因很简单,shell的行为就是这样。对于具有其他编程语言经验的人来说,这可能没有任何意义(如果您将Shell语法称为“语言”,从某种意义上说就是)。


Shell脚本使在许多情况下不引号成为可能(只要是单个字符串的字符序列不包含任何空格或特殊字符)。因此,您可以编写:


 my_command -n -X arg1 arg2

代替(以某种虚构的伪代码)


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

在大多数语言中,这是相反的方式:引用文字字符串,这可以释放“语法空间”,以使用不带任何特殊字符的变量(例如$在shell脚本中)。


Shell语法在很多情况下提供了便利,但是这样做的代价是,在做其他事情时,便利性(和可读性)降低了。这既是诅咒,又是祝福。令人高兴的是,如果您有一个交互式外壳,就可以100%确保您有一个可以处理某种(也许是不雅的)程序的解释器。由于其通用性(尽管存在各种口味),所以外壳程序是一种有用的平台,值得学习。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 549 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信