写在前面:这学期有Linux课,其中有一次的课后作业要求:编写一个shell程序,显示Fibonacci数列的前20项。例如:1,1,2,3,5,8,13,21…。
  我在Ubuntu版本下用vim编辑器写了个名为Fibonacci.sh的shell脚本,输入数字n就能显示斐波那契数列的前n项。
  当时写到如何计算出斐波那契数列第n项的时候不知道怎么求,想到头都爆了,后来列出斐波那契数列的前7项,最后还是通过找规律最后才发现其中的奥妙(暴力求解)…,我定义了三个变量abc,其中a=1为数列的第一项,b=1为第二项,而c作为中间变量用来储存a的值。
  大家先来看看vim下Fibonacci.sh的 核心代码:

c=${a}
a=${b}
b=$((${c}+${b}))

  我来解释下:a=${b}这时a就变成了a的下一项的值,b=$((${c}+${b}))这时b就成了b的下一项的值,而c=${a}是为了保留a在变成下一项之前的值,方便b变成下一项的值时进行运算(因为a已经变成a的下一项了,所以不能直接+a。而如果直接b=$((${a}+${b})),那么下一次a=${b}的值就改变了),然后把三个运算放在循环里就可以无限地算下去了。

  
  
  

创建shell脚本

  

1. 打开终端,

  a.桌面右键=>打开终端(E)。b.也可以通过快捷键Ctrl+Alt+T打开终端。c.或者打开应用程序列表,找到终端,或者在搜索框输入“ter”或者“”终端“。

a.桌面右键=>打开终端(E)
桌面右键打开终端
b.快捷键Ctrl+Alt+T
快捷键

c.应用程序列表
在这里插入图片描述
  

2. 终端默认目录

  打开终端后默认路径是当前用户的主目录,也就是/home/用户名,在我这里是/home/forest
默认路径
  

3. 创建存储脚本的目录

  在当前目录下(/home/forest)创建一个储存shell脚本的目录(mkdir myShell),这样可以方便管理写过的shell脚本。进入该目录(cd myShell),下面这条指令可以创建并进入myShell,这时当前目录为 /home/forest/myShell

mkdir myShell; cd myShell

myShell  

4. 创建shell脚本,并用vim编辑

  在该目录下创建shell脚本(vim Fibonacci.sh),我这里用的时vim文本编辑器(vim要自行安装: sudo apt install vim),也可以用vi来编辑,不过vim是vi的升级版,建议用vim。 Fibonacci是我这个shell脚本的文件名,读者可以自行命名更改。

vim  Fibonacci.sh

vim  Fibonacci.sh

  输入完vim Fibonacci.sh后,终端直接变成vim编辑器,然后就可以编辑代码了,复制下面的代码,然后进入插入模式,右键粘贴然后从普通模式进入命令模式保存退出就可以了。

vim

  4.1 了解Vim的三种模式

  了解Vim的几种模式,能让我们更容易上手,vim有三种模式:普通模式插入模式命令模式

  普通模式下能移动光标、删除代码、执行一些命令、转换到插入模式或者命令模式。 普通模式下按下i键进入插入模式,普通模式下按下:(即shift+;)进入命令模式。

  插入模式下能编辑、删除代码、转到普通模式。插入模式下按下esc键回到普通模式,不能从直接插入模式转到命令模式。

  命令模式下保存代码、退出vim、执行命令回到终端、转到普通模式。命令模式下输入wq然后回车保存并退出vim,输入q!然后回车强制不保存退出vim,esc键回到普通模式。

shell代码

  自己写完代码后一定要检查,如格式、空格(if、for里要特别注意)、大小写、符号、字体符合是否为英文格式。

#!/bin/bash
#输入数字n显示斐波那契数列的前n项

a=1 				#第一项
b=1         		#第二项
c=0         		#中间变量,用来储存a的值
Fibonacci=0			#斐波那契数列的第n项
read -p "输入数字n,显示数列的前n项" n

#如果n<=3则输出前三项
if [ "${n}" -le "3" ]; then
        case ${n} in
                "1")
                        Fibonacci=${a}
                        echo -e "${Fibonacci}"
                        ;;
                "2")
                        Fibonacci=${a}
                        echo -e "${Fibonacci}"
                        echo -e "${Fibonacci}"
                        ;;
                "3")
                        Fibonacci=${a}
						echo -e "${Fibonacci}"
                        echo -e "${Fibonacci}"
                        Fibonacci=$((${a}+${b}))
                        echo -e "${Fibonacci}"
        esac
fi



#如果n>=4,输出剩余的项
if [ "${n}" -ge "4" ]; then
        Fibonacci=${a}
        echo -e "${Fibonacci}"
        echo -e "${Fibonacci}"
        Fibonacci=$((${a}+${b}))
        echo -e "${Fibonacci}"

        for ((i=4; i<=${n}; i=i+1 ))
        do
           	c=${a}
           	a=${b}
           	b=$((${c}+${b}))
			Fibonacci=$((${a}+${b}))
            echo -e "${Fibonacci}"
        done
fi

  
  
  

运行shell脚本

  启动shell脚本命令:bash xxx.sh(xxx为这个shell脚本的文件名)

bash Fibonacci.sh

  运行结果
在这里插入图片描述
  输入数字查看结果
在这里插入图片描述

总结

  这个代码还是有冗余重复的代码的,例如case里的代码和if里的代码就有重复部分。
  这里咱们再来仔细看看斐波那契数列的定义:第n项的值等于第n-1项与第n-2项的和 ,即F(n)=F(n-1)+F(n-2)(n>=3)。
  根据上面的公式F(n-1)=F(n-2)+F(n-3),F(n-2)=F(n-3)+F(n-4),大家发现了没有,斐波那契数列其实是个递归函数。然而当时还不知道什么时递归…不然代码量就可以减少很多(头发就不用掉一地了)。
  下一篇博客写函数和递归,用递归的方式实现输入数字n,打印斐波那契数列的前n项。

  

  
  纸上得来终觉浅,绝知此事要躬行

2021.03.19更新代码

#!/bin/bash
#输入数字n显示斐波那契数列的前n项
#斐波那契数从第3项开始,每一项都等于前两项之和。

a=1                     #第一项
b=1                     #第二项
c=0                     #中间变量,用来储存a的值
read -p "输入数字n,显示数列的前n项:" n
for((i=1; i<=${n};i=i+1))
do
        if [ "${i}" -le "2" ];then      #注意if后面要空格、"[" 之后 和 "]" 之前>都要空格
                echo -n " $a"   
        else
                c=${a}                  #c为中间变量,方便b变成b的下一项
                a=${b}                  #a变成a的下一项
                b=$((${c}+${b}))        #b变成b的下一项,即a+b
                echo -n " $b"           #此时b为前两项之和
        fi
done
echo ""                 #换行,不然不好看

  输出截图
前21项

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐