1、函数

函数:function,功能组件

函数是能够实现模块化编程代码重用的工具,

可被调用:函数有函数名

  调用函数的地方会自动被替换成函数定义的代码


2、函数定义

语法1:

  FuncName(){

        函数体

}

语法2:

   function FuncName{

        函数体

}


3、函数有两种返回值

正常返回的数值:

    函数中命令的执行结果  

执行状态的返回值:

   取决于函数中执行的最后一条语句

   自定义: return N


4、函数可以接受参数

在函数体可以使用类似脚本调用位置参数一样的参数:

$1,$2.....

$0

$?

$#,$#,$*


5、如何在函数中使用变量

变量作用域

   在函数中使用了在主程没有声明的变量:在函数执行结束后即被撤销,无论是否使用local装饰符

查找次序:LEGB

  内层函数-->外层函数-->主程序(全局变量)-->bash内置环境变量

  

练习:

1、写一个脚本,完成如下功能

 显示如下菜单

disk) show disk info

men) show memory info

cpu)show cpuinfo

 显示用户选定的内容

[root@Note3 src]# cat fun2.sh
#/bin/bash

SHOW(){
cat << EOF
disk) show disk info
mem) show memory info
cpu) show cpuinfo
quit) quit script
EOF
}

SHOW
while true
do  read -p "Please input your option: " option
case $option in
"disk")
     df -h
;;
"menm")
     free -m
;;
"cpu")
    cat /proc/cpuinfo
;;
"quit")
    break 11
;;
*)
    echo "Wrong option"
esac
done

2、写一个脚本,判定172.16.0.0网络内有哪些主机在线,在线的用绿色显示,不在线的用红色显示;要求,编程中使用函数;

#!/bin/bash
one(){
   for i in {1..254};do
      ping -c -1 w 1 $1.$i
   done
}
two(){
   for j in {1..254};do
    one $i.$j
      if [[ $? -eq 0 ]];then
         echo -e -n "\033[32mping 172.16.$i.$j ke da !\033[0m\n"
       else
         echo -e -n "\033[31mping 172.16.$i.$j bu ke da !\033[0m \n"
       fi
   done
 }
two 172.16.0.0

练习:写一个脚本,完成如下功能(使用函数):

1、提示用户输入一个可执行命令;

2、获取这个命令所依赖的所有库文件(使用ldd命令);

3、复制命令至/mnt/sysroot/对应的目录中

解释:假设,如果复制的是cat命令,其可执行程序的路径是/bin/cat,那么就要将/bin/cat复制到/mnt/sysroot/bin/目录中,如果复制的是useradd命令,而useradd的可执行文件路径为/usr/sbin/useradd,那么就要将其复制到/mnt/sysroot/usr/sbin/目录中;

4、复制各库文件至/mnt/sysroot/对应的目录中,其要求命令;

#!/bin/bash
options(){
 for i in $*;do
   dirname=`dirname $i`
   [ -d /mnt/sysroot$dirname ] || mkdir -p /mnt/sysroot$dirname
   [ -f /mnt/sysroot$i ]||cp $i /mnt/sysroot$dirname/
 done
}
while true;do
read -p "Enter a command : " pidname
  [[ "$pidname" == "quit" ]] && echo "Quit " && exit 0
  bash=`which --skip-alias $pidname`
  if [[ -x $bash ]];then
    options `/usr/bin/ldd $bash |grep -o "/[^[:space:]]\{1,\}"`
    options $bash
  else
    echo "PLZ a command!"
   fi
done


练习:写一个脚本,完成如下功能(使用函数):

1、脚本使用格式:

mkscript.sh [-D|--description "script description"] [-A|--author "script author"] /path/to/somefile

2、如果文件事先不存在,则创建;且前几行内容如下所示:

#!/bin/bash

# Description: script description

# Author: script author

#

3、如果事先存在,但不空,且第一行不是“#!/bin/bash”,则提示错误并退出;如果第一行是“#!/bin/bash”,则使用vim打开脚本;把光标直接定位至最后一行

4、打开脚本后关闭时判断脚本是否有语法错误

如果有,提示输入y继续编辑,输入n放弃并退出;

如果没有,则给此文件以执行权限;


#!/bin/bash

read -p "Enter a file: " filename

options(){

if [[ $# -ge 0 ]];then

  case $1 in

 -D|--description)

      authname=$2

      descr=$4

       ;;

 -A|--author)

      descr=$2

      authname=$4

      ;;

   esac

fi

}

command(){

  if  bash -n $filename &> /dev/null;then

     chmod +x $filename

  else

    while true;do

     read -p "[y|n]:" option

     case $option in

    y)

     vim + $filename

     ;;

    n)

     exit 8

     ;;

    esac

    done

  fi

  exit 6

}

oneline(){

if [[ -f $filename ]];then

  if [ `head -1 $filename` == "#!/bin/bash" ];then

      vim + $filename  

  else 

    echo "wrong..."

    exit 4

  fi

else

 touch $filename && echo -e "#!/bin/bash\n# Description: $2\n# Author: $4" > $filename

 vim + $filename

fi

command

}

options $*

oneline