2017-01-19 94 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是一種有用的平臺,值得學習。