bash 函数使用,实现模块化编程

bash支持使用函数,函数出现的地方,而自动被替换成函数定义的代码,一个函数定义后可以多次被重复使用,大大减少代码量

函数定义格式:

第一种

FuncName() {
    函数体
        }

第二种

function FuncName {
    函数体
}

函数有两种返回值:
     正常返回的数据:
           函数中的打印语句,如echo或print
           函数中命令的执行结果
     执行状态返回值:
          取决于函数中执行的最后一条语句,最后一条执行成功返回0,否刚返回其它
          反回值可以自定义:使用return N   # N为自定义返回值

函数可以接受参数:
        在函数体可以使用类似脚本调用位置参数一样的参数
        $1, $2, ...
        $#
        $*, [email protected]

如果想把脚本的全部位置参数,统统传递给脚本中某函数使用,怎么办?
            使用$*传递,如果想一个一个使用,则判断$#有几个,再循环一个一个的使用

如果在函数中使用变量:变量作用域
    在函数中使用了在主程序中声明的变量,重新赋值会直接修改主程序中的变量;
        如果不期望函数与主程序中的变量冲突,函数中使用变量都用local修饰;即使用局部变量;
    在函数中使用了在主程序中没有声明的变量,在函数执行结束后即被撤消,无论是否使用local修饰符;

应用示例:

写一个脚本,完成如下功能
1、显示如下菜单
disk) show disk info
mem) show memory info
cpu) show cpuinfo
2、显示用户选定的内容;

#!/bin/bash
#
showMenu() {  ##  第一种定义函数名的方法
cat << EOF
disk) show disk info
mem) show memory info
cpu) show cpuinfo
quit) exit script
EOF
}

function main {  ## 第二种调用函数的方法
while true ;do
showMenu    ##  调用定义的函数,函数内嵌函数。
read -p "please enter menu option: " option
option=`echo $option | tr ‘A-Z‘ ‘a-z‘`
  case $option in
        disk) df -h ;;
        mem) free -m ;;
        cpu) cat /proc/cpuinfo ;;
        quit) exit 0 ;;
        *) echo "error option."
  esac
done
}
main  ## 调用函数

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

#!/bin/bash
#
cnetping() {
 for i in {1..254};do
        ping -c 1 -w 1 $1.$i
 done
}
# cnetping 192.168.1.= 192.168.1+$1
bnetping() {
 for j in {0..255};do
   cnetping $1.$j
 done
}
# bnetping 172.16. = 172.16+$j+$i
anetping() {
 for k in {0..255};do
  bnetping $1.$k
 done
}
# anetping 10.=10.$k+$j+$i
read -p "enter IPaddr: " IPaddr
NetType=`echo $IPaddr | cut -d‘.‘ -f1`
if [ $NetType -ge 0  -a  $NetType -le 127 ];then
   anetping `echo $IPaddr | awk -F‘.‘ ‘{print $1}‘`
elif [ $NetType -ge 128  -a  $NetType -le 191 ];then
   bnetping `echo $IPaddr | awk -F‘.‘ ‘{print $1"."$2}‘`
elif [ $NetType -ge 192  -a  $NetType -le 223 ];then
   cnetping `echo $IPaddr | awk -F‘.‘ ‘{print $1"."$2"."$3}‘`
else
  echo "error IP"
fi

写一个脚本,完成如下功能(使用函数):
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
#
copytarget=/mnt/sysroot
[ -d $copytarget ] || mkdir -p $copytarget
command () {
if which $COMMAND &> /dev/null;then
        COMMAND=`which --skip-alias $COMMAND`
else
        return 5
fi
}
copycommand() {
 command_dir=${copytarget}`dirname $COMMAND`
 [ -d ${command_dir} ] || mkdir -p ${command_dir}
 [ -f ${copytarget}${COMMAND} ] || cp $COMMAND ${command_dir}
}
copylib() {
 for i in  `ldd $COMMAND | grep -o "/[^[:space:]]\{1,\}"`;do
  libdir=${copytarget}`dirname $i`
 [ -d $libdir ] || mkdir $libdir
 [ -f ${copytarget}${i} ] || cp $i $libdir
 done
}
while true;do
read -p "please enter command: " COMMAND
[ "$COMMAND" == ‘quit‘ ] && exit 7
 command
[ $? -eq 5 ] && continue
 copycommand
 copylib
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
#
#mkscript.sh [-D|--description "script description"] [-A|--author "script author"] /path/to/somefile
while true;do
[ $# -lt 1 ] && break
case $1 in
 -D|--description)
     description=$2
  shift 2 ;;
 -A|--author)
     author=$2
  shift 2 ;;
 *)
    file=$1
  shift 1
esac
done
[ -d `dirname $file` ] || mkdir `dirname $file`
if ! [ -e $file ];then
  echo -e "#!/bin/bash\n# Description:${description}\n# Author:${author}\n#" > $file
elif [ -f $file ];then
   head -1 $file | grep ‘#!/bin/bash‘ &> /dev/null && vim +$ $file
else
         echo " error $file not scripts file."; exit 7
fi
## 检查脚本
while true;do
if  bash -n $file &> /dev/null;then
        chmod +x $file
        break
fi
read -p "enter Y contiue ,N exit script!" option
 case $option in
  y|Y)
        vim $file
        ;;
  n|N)
        exit 8
        ;;
  *)
    echo "error option"
 esac
done
时间: 03-26

bash 函数使用,实现模块化编程的相关文章

bash函数定义/使用/传参…

函数:function, 功能     过程式编程,代码重用         模块化编程         简洁             语法:         function f_name {             函数体         }         或者         f_name() {             函数体         }         调用:使用函数名         函数名出现的地方,会被自动替换为函数代码:             练习:利用函数改写此前

select、bash函数初识及rpm命令详解

8月18号,主要学习内容: 一.循环的特殊用法及select 二.bash函数基础 三.rpm命令 一.循环的特殊用法及select 1)while循环的特殊用法(遍历文件的每一行):  while read line; do 循环体 done < /PATH/FROM/SOMEFILE 依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line 2)((-))格式 可以用于算术运算 双小括号方法也可以使bash Shell实现C语言风格的变量操作 #I=10 #((

从273二手车的M站点初探js模块化编程

前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数据. 273这个M站点是产品推荐我看的.第一眼看这个产品时我就再想他们这个三次加载和翻页按钮的方式,那么小分页的pageIndex是怎么计算的.所以就顺便看了下源码. 提到看源码时用到了Chrome浏览器的格式化工具(还是朋友推荐我的,不过这个格式化按钮的确不明显,不会的话自行百度). 三次加载和分

Javascript模块化编程(二):AMD规范

作者: 阮一峰 日期: 2012年10月30日 这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这一点就更重要了. 目前,通行的Javascript模块规范共有两种

黑马程序员---C基础6【#include指令】【模块化编程】【计算机的进制】【原码、反码、补码】【位运算符】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [#include指令] 1.文件包含命令的格式: 1)#include “”双引号是包含用户自己书写定义的文件(可以是头文件,也可以是普通的文件)#include是预处理指令,不是一个语句,不需要加封号 2)#include<>   包含一个系统(编译器自带)的头文件 2.文件包含的实质: 把指定文件内容插入该命令行位置取代该命令行, include不一定非要写在第一行: 3.includ

模块化编程:阮一峰 模块化编程

由于一个页面写的js太多了,都写在一个文件中,不好调试.所以我的目标就是如何能把所需的js文件,分割成易于维护的代码块,之间能相互调用方法和属性.虽然采用命名空间也能应付,但是不知道什么才是最好的做法. 看了这一系列文章,感觉是处理模块间的依赖关系.这也确实是需要做的事情,比如使用jquery UI,bootstrap等好用的库时,就需要处理好模块的关系. javascripts模块化编程(一):模块的写法 一.原始写法:函数的堆积 二.对象写法:会暴露所有的模块成员 三.立即执行函数:不暴露私

Javascript模块化编程(一):模块的写法

作者: 阮一峰 日期: 2012年10月26日 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,它不支持"类&qu

Javascript模块化编程

(一):模块的写法 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑. Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,它不支持"类"(class),更遑论"模块"(module)了.(正在制定中的ECMAScript标准第六版,将正式支持"

用模块化编程

用模块化编程 最近想边学边整一下模块化编程,那么先从为何要使用模块化编程说起吧,可能你刚听说模块化编程,也没有关系,本篇讲的是很基础的东西. 一开始写代码的时候,我们可能只需要一个js文件,去实现一个很小的功能,比如下面这样: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&g

嵌入式 Linux C语言(十一)——C语言模块化编程

嵌入式 Linux C语言(十一)--C语言模块化编程 一.C语言模块化编程 所谓模块化编程,就是指一个程序包含多个源文件(.c 文件和 .h 文件),每个模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明.C语言模块化编程中对.c..h文件的潜规则: 1..c 文件主要负责实现,也就是定义函数:.h 文件主要负责声明,比如函数声明.宏定义等,结构的定义.自定义数据类型一般也放在头文件中,不能在.h文件中定义变量.将一个功能模块的代码单独编写成一个.c文件,然后把该