茅屋为秋风 发表于 2018-8-19 15:16:55

shell编程--函数篇

  一:函数分类

[*]  本地函数(本地变量)
  local 变量名。本地函数中对变量的修改,赋值只在当前函数运行期间有效。
  func1 () { local name=test;echo "func1:name=$name"; local age=18;echo "func1:age=$age"; echo $$;}
[*]  全局函数(本地变量)
  不加local及declare -i(仅限整数数字) 默认为全局函数,而declare -ig也为全局函数(本地变量)。全局函数对变量的修改及赋值对当前shell均有效。但子Shell不继承
  func1 () {name=test; declare -i age=16; echo "func1:name=$name, func1:age=$age"; }
[*]  环境函数(环境变量)
  declare -xf 环境函数中的变量会对子shell继承 或 export -f
  练习1:使用函数编写脚本,实现打印国际象棋棋盘,要求每个格子由8个空格组成。
  方法一:
  #!/bin/bash
  red() {
  echo -e "\033[41m      \033[0m\c"
  }
  yel() {
  echo -e "\033[43m      \033[0m\c"
  }
  redyel() {
  for ((i=1;i /mnt/sysroot/usr/bin/passwd
  (4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下:如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
  (5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit退出
  cpcmd () {
  cp `which $1|tail -1` /mnt/sysroot`which $1|tail -1` &> /dev/null
  ldd `which $1|tail -1`|egrep -o "/lib64/.*"|sed -r 's@/lib64(/.*) .*@\1@' > /mnt/sysroot/test.txt
  while read line
  do
  cd /mnt/sysroot/lib64
  if [ -f $line ];then
  continue
  else
  cp /lib64$line /mnt/sysroot/lib64$line &> /dev/null
  fi
  done < /mnt/sysroot/test.txt
  }
  #!/bin/bash
  . /root/bin/myfunctions
  while true;do
  read -p &quot; 请输入命令:&quot; cmd
  cpcmd $cmd
  done
  练习5:
  编写函数实现两个数字做为参数,返回最大值
  max () {
  if [ $1 -ge $2 ];then
  echo &quot;最大值是:$1&quot;
  else
  echo &quot;最大值是:$2&quot;
  fi
  练习6:
  斐波那契数列又称黄金分割数列,因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列: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阶斐波那契数列
  fei () {
  if [ $1 -eq 0 ];then
  let f$1=0
  echo $f$1
  fi
  if [ $1 -eq 1 ];then
  let f$1=1
  echo $f$1
  fi
  if [ $1 -gt 1 ];then
  echo $[$(fei $[$1-1])+$(fei $[$1-2])]
  fi
  }
  #!/bin/bash
  . /root/bin/myfunctions
  for n in `seq $1`
  do
  fei $n
  done
  练习7:
  汉诺塔(又称河内塔)问题是源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,利用函数,实现N片盘的汉诺塔的移动步骤
  han () {
  if [ $1 -eq 1 ];then
  echo &quot; $2 --> $4&quot;
  else
  han $[$1-1] $2 $4 $3
  echo &quot; $2 --> $4 &quot;
  han $[$1-1] $3 $2 $4
  fi
  }
  #!/bin/bash
  . /root/bin/myfunctions
  han $1 'A' 'B' 'C'
  大家也可能发现了,练习六,练习七考察的是递归,在最后我们来介绍一下什么是递归,以及遇到递归的思路是什么。
  首先:一定有一种可以退出程序的情况,我们也叫作递归出口。
  其次:总是在尝试将一个问题化简到更小的规模。
  最后:父问题与子问题不能有重叠的部分
  如果满足了这三点。我们就可以利用递归来处理问题了。

页: [1]
查看完整版本: shell编程--函数篇