生活如麻 发表于 2018-8-18 12:33:34

学习shell script

  如果你的想要管理好你的主机,那么就要好好学习自动管理系统的有效工具——hell script!基本上,shell script有点像早期的批处理文件,即将很多命令整合起来一次执行,但是shell script拥有更强大的功能,它可以进行类似程序的编写,并且不需要经过编译就能够执行,非常方便我们对系统进行管理。
  今天我们主要通过对一些shell script的习题来加深对脚本知识的学习。
  习题1:对成绩进行判断,要求输入一个正整数,以60分,85分为界输出不同的评语。
  #!/bin/bash
  #-------------------------------------------------
  # Filename:score.sh
  # Revision:1.0
  # Date: 2017-09-14
  # Author:liumengjiao
  #Email:yinianqi11@163.com
  #Website:http://liumengjiao.blog.51cto.com/
  # Description:score evaluation
  #-------------------------------------------------
  read -p "Pleaseinput your score: " score
  if [[ $score =~[^0-9] ]] ;then
  echo "please input a positive integer"
  exit 10
  elif [ $score -gt100 ];then
  echo "Your score is wrong"
  exit 20
  elif [ $score -ge 85];then
  echo "Your score is verygood"
  elif [ $score -ge 60];then
  echo "Your score is soso"
  else
  echo "You have to work hard"
  fi
  执行测试:

  解析:第一行#!/bin/bash声明这个script使用的shell,整个script当中,除了第一行的“#!”是用来声明shell的之外,其他的#都是用来注释的。所以在上面的程序当中,第一行以下的就是用来说明整个程序的基本程序。一般来说,建议一定要养成说明该脚本的内容与功能、版本信息、作者与联系方式、建立日期等习惯。这有助于将来程序的修改和调试。程序部分:主要用到了条件判断if语句。根据不同的分数输出不同的评价。
  习题2 : 编写脚本/root/bin/yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或其它信息
  #vim yueorno10.sh
  # -------------------------------------------------
  # Filename:yesorno10.sh
  # Revision:1.0
  # Date: 2017-09-14
  # Author:liumengjiao
  # Email:yinianqi11@163.com
  # Website:http://liumengjiao.blog.51cto.com/
  # Description:score evaluation
  # -------------------------------------------------
  read -p "Yue ma?yes or no: " ans
  ans=`echo $ans|tr"A-Z" "a-z"`
  case $ans in
  yes|y)
  echo "yue"
  ;;
  no|n)
  echo "no yue"
  ;;
  *)
  echo "answer error!"
  ;;
  esac
  解析:这一题用到了case...esac判断。它的格式如下
  case$变量名称 in
  PAT1)
  分支1
  ;;
  PAT2)
  分支2
  ;;
  ...
  *)
  默认分支
  ;;
  esac
  执行测试:

  执行程序,你可以输入yes、y、no、n的各种大小写组合,如果输入yes或者y,就在屏幕上打印“yue”,如果输入no或者n,就在屏幕上打印“no yue”,输入其它则打印“answer error!”。使用这样的方式对于某些固定字符串来执行的变量内容就显得更加方便。系统的很多启动脚本就是这种写法的。
  case支持glob风格的通配符:
  *: 任意长度任意字符
  ?: 任意单个字符
  []:指定范围内的任意单个字符
  a|b: a或b
  习题3:8行6列随机颜色闪烁*
  for i in {1..8};do
  for j in {1..6};do
  color=$
  echo -e"\033[1;${color};5m*\033[0m\c"#打印随机闪烁*
  done
  echo
  done

  解析:这个程序用到了for循环。格式如下:
  for 变量名 in 列表;do
  循环体
  done
  执行机制:依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束
  这个程序的意思是打印8行,每行打印6个随机颜色的*,其中,i控制行,j控制列。
  习题4:编写脚本,实现打印国际象棋棋盘
  #!/bin/bash
  # -------------------------------------------------
  # Filename:chess10.sh
  # Revision:1.0
  # Date: 2017-09-11
  # Author:liumengjiao
  # Email:yinianqi11@163.com
  # Website:http://liumengjiao.blog.51cto.com/
  # Description:
  # -------------------------------------------------
  color1='\033[46m    \033[0m' #天蓝色
  color2='\033[47m    \033[0m' # 白色
  for i in {1..8};do
  for k in {1..2};do
  if [ $ -eq 0 ];then
  for j in {1..4};do
  echo -en "$color1$color2"
  done
  else
  for j in {1..4};do
  echo -en "$color2$color1"
  done
  fi
  echo
  done
  done

  解析:这道题将for循环和if条件判断结合在一起,奇数行开头打印白色,偶数行开头打印天蓝色,从而实现不同方块颜色的交叉显示。
  习题5:斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)。请输入n值,打印斐波那契数列
  方法1:利用迭代的方法得出前n个斐波那契数列
  #!/bin/bash
  #-------------------------------------------------
  # Filename:fibo.sh
  # Revision:1.0
  # Date: 2017-09-14
  # Author:liumengjiao
  #Email:yinianqi11@163.com
  # Website:http://liumengjiao.blog.51cto.com/
  # Description:
  #-------------------------------------------------
  read -p "请输入n值:" num
  i=0
  while [ $i -le $num];do
  if [ $i -eq 0 ];then
  num1=0
  echo $num1
  elif [ $i -eq 1 ];then
  num2=1
  echo $num2
  else
  tmp=$num2
  let num2=num1+num2
  num1=$tmp
  echo $num2
  #let num2=num1+num2
  #echo $num2
  fi
  let i++
  done

  方法2:利用递归的方法得出第n个斐波那契数
  #!/bin/bash
  # -------------------------------------------------
  # Filename:Fibonacci
  # Revision:1.0
  # Date: 2017-09-14
  # Author:liumengjiao
  # Email:yinianqi11@163.com
  # Website:http://blog.csdn.net/ruoshuiss/
  # Description:
  # -------------------------------------------------
  fibo() {
  if [ $1 -eq 0 ];then
  echo 0
  elif [ $1 -eq 1 ];then
  echo 1
  else
  echo $[$(fibo $[$1-1])+$(fibo $[$1-2])]
  fi
  }
  fibo $1

  解析:这道题不仔细看就会只想到用递归算法解决,但是,用递归的方法太浪费资源,运行速度慢,其实可以利用迭代的方法,从头开始,不断交换数值,一步步得出下一个数。在方法2中,用到了函数的功能。
  函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程,它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分,函数和shell程序比较相似,区别在于:Shell程序在子Shell中运行,而Shell函数在当前Shell中运行。因此在当前Shell中,函数可以对shell中变量进行修改
  习题6:汉诺塔(又称河内塔)问题是源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,利用函数,实现N片盘的汉诺塔的移动步骤。
  #!/bin/bash
  # -------------------------------------------------
  # Filename:hanoi10.sh
  # Revision:1.0
  # Date: 2017-09-14
  # Author:liumengjiao
  # Email:yinianqi11@163.com
  # Website:http://liumengjiao.blog.51cto.com/
  # Description:
  # -------------------------------------------------
  echo "将圆盘借助C从A移到B"
  read -p "输入黄金圆盘数:" n
  move(){
  echo "move $1 from $2 ======> $3"
  }
  hanoi(){
  if [ $1 -eq 1 ];then
  move $1 $2 $3
  else
  hanoi $[$1-1] $2 $4 $3
  move $1 $2 $3
  hanoi $[$1-1] $4 $3 $2
  fi
  }
  hanoi $n A

  解析:将n-1个盘子看做一个整体移动,然后将最后一个盘子移到B,通过递归移动剩下的n-1个盘子。

页: [1]
查看完整版本: 学习shell script