2016-11-11 138 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