2017-01-19 95 views
3
1 #!/bin/bash 
    2 
    3 declare -r NUM1=5 
    4 NUM2 =4 
    5 
    6 num3=$((NUM1 + NUM2)) 
    7 num4=$((NUM1 - NUM2)) 
    8 num5=$((NUM1 * NUM2)) 
    9 num6=$((NUM1/NUM2)) 
10 
11 echo "$num3" 
12 echo $((5**2)) 
13 echo $((5%4)) 
14 

荫这个bash脚本和IAM的同时运行脚本我得到了错误变量赋值为什么在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 

所以我已经改变了代码,这和错误了。

 1 #!/bin/bash 
     2 
     3 declare -r NUM1=5 
     4 NUM2=4 
     5 
     6 num3=$((NUM1 + NUM2)) 
     7 num4=$((NUM1 - NUM2)) 
     8 num5=$((NUM1 * NUM2)) 
     9 num6=$((NUM1/NUM2)) 
    10 
    11 echo "$num3" 
    12 echo $((5**2)) 
    13 echo $((5%4)) 
    14 

为什么不能我们给空间,同时我们给变量的值,因为这是惯例给空间以更好地理解code.Can人的可见性的解释我这个?

任何建议或澄清,欢迎...

+1

这只是'bash'中的一种范式,你不能质疑 – Inian

+2

在shell中,空格是重要的分隔符。在大多数情况下,你**不能**添加或删除它们以使事情看起来更好,因为它们改变了命令行的含义。 –

+0

谢谢,虽然它是一个小问题.Clarity给出更少的错误。 –

回答

6

这不是在bash公约(或更一般地,POSIX家族弹)。

至于“为什么”,那是因为做错的各种方式都有命令的有效含义。如果您制作了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 
+0

“NUM2 = 4#运行”NUM3“? – some

3

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

从文档

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

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

你不能把不带引号的空格周围等号是因为庆典将其解释为命令的原因。

2

原因很简单,壳的构建方式就像这样。对于在其他编程语言方面有经验的人来说可能没有意义(如果你将shell语法称为“语言”,从某种意义上说)。

Shell脚本可以在很多情况下简单地不引用字符串(只要字符序列是一个字符串的序列不包含任何间距或特殊字符)。由于这一点,你可以写:

my_command -n -X arg1 arg2 

相反的(在某种虚构的伪代码)

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

在大多数语言中,它是周围的其他方式:文字字符串被引用,这为使用不带任何特殊字符的变量释放“语法空间”(如Shell脚本中的$)。

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