2016-11-11 168 views
1

我對Bash腳本非常陌生,無法在網上找到更多基本內容的幫助。我的任務是運行一個程序,試圖接受用戶輸入,並通過將偶數除以2並將奇數乘以3並加1來得到它。我不知道任何高級命令,並且我確信有更簡單的方法來做到這一點,但我不明白爲什麼我的代碼給我從gedit「命令未找到」錯誤。Bash變量操作

我的代碼:

#!/bin/bash 
#Takes in a number and computes it into hailstone series while 
#displaying each number onto the screen 
echo Enter number: 
read n 

while [$n -gt 1] 
do 
if [$n % 2 -eq 0] 
    then 
    let n=n/2 
    echo $n 
else 
    let n=n*3+1 
    echo $n the number is header 
fi 
done 

我的變量不斷跳過第一個if語句並返回我的「是首部」檢查聲明,我不希望它。如果我輸入8,它應該被修改2 -eq 0,因此它應該分裂直到它等於1或更少。

+0

你沒有足夠小心的間距。你必須使用'[$ n-gt 1]',因爲命令名是'[','[''必須是']'的最後一個參數。或者你可以使用'[['''''''''' Shell腳本需要對空間有很多的關注。 –

+0

http://shellcheck.net/是你的朋友,用於查找語法錯誤而不需要人類參與。 –

+1

btw,就如何思考它而言:'['是**命令**,不是語言語法。正如你需要用兩個單詞來運行'ls mydir'而不是'lsmydir',你需要運行'[foo'而不是'[foo''來防止shell尋找一個名爲'[foo'的不同命令。如果你想讓事情變得不那麼困惑,那麼使用命令'test「$ n」-gt 1'而不是''「$」n「-gt 1]',因爲'test'看起來不像其他地方的語法。 –

回答

1

您需要在[之後和]之前放置空格。因此,而不是while [$n -gt 1],請寫while [ $n -gt 1 ]

[$n % 2 -eq 0]也是如此,但這並不會有太大幫助,因爲[ ... ]中沒有%運算符。您可以改用((...))。 我還使用更簡單,更直觀的((...))語法重寫了let命令。

#!/bin/bash 
echo Enter number: 
read -r n 

while ((n > 1)) 
do 
    if ((n % 2 == 0)) 
    then 
     ((n /= 2)) 
     echo $n 
    else 
     ((n = n * 3 + 1)) 
     echo $n the number is header 
    fi 
done 
+0

@Rep我進一步改進了一下。 – janos

+0

保佑你的靈魂先生。感謝大家的幫助07 – Rep