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)。
至于"为什么",那是因为做错的各种方式都具有作为命令的有效含义。如果你使
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."
变量赋值不同,使用此语法
你不能在等号周围放置不带引号的空格的原因是因为bash会将其解释为命令。
原因很简单,shell的构建方式与此类似。对于具有其他编程语言经验的人来说可能没有意义(如果你将shell语法称为"语言",从某种意义上说它就是这样)。
在许多情况下,Shell脚本可以简单地不引用字符串(只要一个字符序列意味着单个字符串不包含任何间距或特殊字符)。多亏了这个,你可以写:
1 | my_command -n -X arg1 arg2 |
而不是(在某种虚构的伪代码中)
1 | "my_command""-n""-X""arg1""arg2" |
在大多数语言中,它是另一种方式:引用文字字符串,它释放"语法空间"以使用没有任何特殊字符的变量(如shell脚本中的
Shell语法在频繁的情况下提供了便利,但在执行其他操作时会牺牲,便利性和可读性。这既是诅咒,也是祝福。好消息是知道如果你有一个交互式shell,你可以100%确定你有一个解释器,可以处理某种(可能是不优雅的)程序。由于其普遍可用性(尽管存在各种风味),shell是一种非常有用的平台,值得学习。