bash脚本----case和function

case语句

什么时候用到case?

当多次判断变量是否属于某个字符串时候

case语句的语法格式:

case  $VARAIBLE  in

PAT1) 注:如果PAT1匹配到$VARAIBLE时候,执行分支1 同理

分支1

;; 注:每一个判断条件都要双分号,同理

PAT2)

分支2

;;

...

*)  都不属于以上情况,执行分支n

分支n

;;

esac   最后一个不需要

 特性:case支持glob风格的通配符:

*:任意长度的任意字符;

?:任意单个字符;

[]:范围内任意单个字符;

a|b:a或b;

case简单示例:写一个服务框架脚本;


(1) 此脚本可接受start, stop, restart, status四个参数之一;

(2) 如果参数非此四者,则提示使用帮助后退出;

(3) start,则创建lockfile,并显示启动;stop,则删除lockfile,并显示停止;restart,则先删  除此文件再创建此文件,而后显示重启完成;status,如果lockfile存在,则显示running,否则,则显示为stopped.

 #!/bin/bash
      #
      # chkconfig: - 50 50  注:定义运行级别、启动优先级、关闭优先级
     # description: test service script  注:描述信息
     #
         prog=$(basename $0)  注:以变量替换的方式取路径基名,并赋值给变量prog
         lockfile=/var/lock/subsys/$prog 注:给变量lockfile赋值一个文件路径
        case $1  in
        start) 
              if [ -f $lockfile ]; then   注:-f进行文件存在性测试
                 echo "$prog is running yet."
             else
                touch $lockfile
                [ $? -eq 0 ] && echo "start $prog finshed." 注:以命令状态返回值判断
             fi                                            文件是否创建成功
           ;;
        stop) 
            if [ -f $lockfile ]; then      逻辑同理
                   rm -f $lockfile
                   [ $? -eq 0 ] && echo "stop $prog finished."
             else
                    echo "$prog is not running."
            fi
           ;;
        restart)
            if [ -f $lockfile ]; then
                rm -f $lockfile
                touch $lockfile
                echo "restart $prog finished."
            else
                touch -f $lockfile
                echo "start $prog finished."
            fi
          ;;
        status)
                if [ -f $lockfile ]; then
                    echo "$prog is running"
                else
                     echo "$prog is stopped."
                fi
          ;;
        *)
            echo "Usage: $prog {start|stop|restart|status}"
            exit 1
        esac

函数:function 


  为什么要用到函数?

为了简化自己写的代码量,重复多次使用的功能可以包装成函数多次调用。也会使你的代码更有结构

什么是函数?

把一段独立功能的代码当作一个整体,并为之一个名字;命名的代码段,此即为函数;

怎样使用函数?

定义函数的代码段不会自动执行,在调用时执行;所谓调用函数,在代码中给定函数名即可;

函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码;函数的生命周期:每次被调用时创建,返回时终止;

                语法一:

function  f_name  {

...函数体...

}

                语法二:

f_name()  {

...函数体...

}



自定义状态返回值方法:

其状态返回结果为函数体中运行的最后一条命令的状态结果;

自定义状态返回值,需要使用:return

return [0-255]

0: 成功

1-255: 失败

函数的执行结果返回值:

(1) 使用echo或printf命令进行输出;

(2) 函数体中调用的命令的执行结果;

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

函数使用举例1:给定一个用户名,取得用户的id号和默认shell;

  #!/bin/bash
        #
    userinfo() {
            if id "$username" &> /dev/null; then
                grep "^$username\>" /etc/passwd | cut -d: -f3,7
            else
                echo "No such user."
            fi
        }
            username=$1
            userinfo
            username=$2
            userinfo

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

函数使用举例2:服务脚本框架

 #!/bin/bash
            #
            # chkconfig: - 50 50
            # description: test service script
      
            prog=$(basename $0)
            lockfile=/var/lock/subsys/$prog
        start() {           注:函数定义
                if [ -f $lockfile ]; then
                        echo "$prog is running yet."
                else
                    touch $lockfile
                    [ $? -eq 0 ] && echo "start $prog finshed."
                fi
                }
        stop() {
                    if [ -f $lockfile ]; then
                        rm -f $lockfile
                        [ $? -eq 0 ] && echo "stop $prog finished."
                    else
                            echo "$prog is not running."
                    fi
                }
        status() {
                if [ -f $lockfile ]; then
                    echo "$prog is running"
                else
                    echo "$prog is stopped."
                fi
                    }
        usage() {
                    echo "Usage: $prog {start|stop|restart|status}"
                }
        case $1 in
        start)  
                start ;;  注:调用start函数,以下同理
        stop)
                stop ;;
        restart)
                stop
                start ;;
        status)
                status ;;
            *)
                    usage
        exit 1 ;;
                    esac

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

函数可以接受参数:

1.在函数体中当中,可以使用$1,$2, ...引用传递给函数的参数;

2.还可以函数中使用$*或[email protected]引用所有参数,

3. $#引用传递的参数的个数;

例如,testfunc  arg1 arg2 arg3 ...

注:在调用函数时,在函数名后面以空白符分隔给定参数列表即可

示例:添加10个用户,

添加用户的功能使用函数实现,用户名做为参数传递给函数;

函数可以接受参数举例1

 #!/bin/bash
                #
                # 5: user exists
                addusers() {
                        if id $1 &> /dev/null; then
                                return 5
                        else
                            useradd $1
                            retval=$?
                            return $retval
                            fi
                            }
                for i in {1..10}; do
                        addusers ${1}${i}
                        retval=$?
                    if [ $retval -eq 0 ]; then
                            echo "Add user ${1}${i} finished."
                    elif [ $retval -eq 5 ]; then
                            echo "user ${1}${i} exists."
                    else
                            echo "Unkown Error."
                     fi
                     done

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

练习:写一个脚本;

使用函数实现ping一个主机来测试主机的在线状态;主机地址通过参数传递给函数;

主程序:测试172.16.1.1-172.16.67.1范围内各主机的在线状态;

练习:写一个脚本;

打印NN乘法表;

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

变量作用域


局部变量:作用域是函数的生命周期;在函数结束时被自动销毁;

定义局部变量的方法:local VARIABLE=VALUE

本地变量:作用域是运行脚本的shell进程的生命周期;因此,其作用范围为当前shell脚本程序文件;

变量作用域举例1

            #!/bin/bash
            #
                name=tom
            setname() {
                local name=jerry
                echo "Function: $name"
                        }
                setname
                echo "Shell: $name"

函数递归

函数直接或间接调用自身;

10!=10*9!=10*9*8!=10*9*8*7!=...

n*(n-1)!=n*(n-1)*(n-2)!=

函数递归举例1

    #!/bin/bash
                    #
                    fact() {
                        if [ $1 -eq 0 -o $1 -eq 1 ]; then
                      echo 1
                         else
                           echo $[$1*$(fact $[$1-1])]
                          fi
                            }
                        fact $1

函数递归举例2

1,1,2,3,5,8,13,21,...

 #!/bin/bash
                #
                    fab() {
                        if [ $1 -eq 1 ]; then
                            echo -n "1 "
                    elif [ $1 -eq 2 ]; then
                            echo -n "1 "
                    else
                            echo -n "$[$(fab $[$1-1])+$(fab $[$1-2])] "
                    fi
                            }
                    for i in $(seq 1 $1); do
                        fab $i
                        done
                        echo

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

编外扩展

示例1:显示一个菜单给用户;

cpu) display cpu information

mem) display memory information

disk) display disks information

quit) quit

要求:(1) 提示用户给出自己的选择;

(2) 正确的选择则给出相应的信息;否则,则提示重新选择正确的选项;

#!/bin/bash
#
cat << EOF
cpu) display cpu information
mem) display memory infomation
disk) display disks information
quit) quit
===============================
EOF
read -p "Enter your option: " option
while [ "$option" != "cpu" -a "$option" != "mem" -a                                
"$option" != "disk" -a "$option" != "quit" ]; do
echo "cpu, mem, disk, quit"
read -p "Enter your option again: " option
done
if [ "$option" == "cpu" ]; then
lscpu
elif [ "$option" == "mem" ]; then
free -m
elif [ "$option" == "disk" ]; then
fdisk -l /dev/[hs]d[a-z]
else
echo "quit"
exit 0
fi
时间: 2024-11-01 22:12:10

bash脚本----case和function的相关文章

bash脚本之函数function

脚本编程之函数: function:功能,结构化编程,不能独立运行,需要调用时执行,可以多次被调用 定义一个函数: function FUNCNAME { COMMAND } 或 FUNCNAME(){ COMMAND } 自定义执行状态返回值 return # 0-255 接受参数的函数: FUNCNAME m n m在function函数里面用$1引用,相应地,n对应于$2 例子:写一个脚本,使用函数完成 1.函数能够接受一个参数,参数为用户名:判断一个用户是否存在 如果存在,就返回次用户的

Bash脚本之if、case、read和位置参数

在学会了基本的命令之后,我们就可以使用这些命令来进行编程了.在Linux中的编程称为shell脚本,是将命令进行结合形成的类似Windows中批处理的东西.在这个脚本中,可以有变量和结构体.每一个程序所拥有的程序执行过程,例如:顺序执行.选择执行和循环执行都可以在脚本中体现出来.下面就对shell脚本进行介绍. 首先,shell脚本编程是过程式编程语言,也就是说shell脚本强调接下来要执行的步骤,就好像是人在对shell说接下来要做什么,要明确的指出每一步的方法.然后shell还是脚本类语言,

玩转Bash脚本:选择结构之case

总第5篇 之前,我们谈到了if. 这次我们来谈还有一种选择结构--case. case与if if用于选择的条件,不是非常多的情况,假设选择的条件太多.一系列的if.elif,.也是醉了. 没错,case在bash中的地位,和switch在C中的地位一样. 可是使用方法可大有不同. 代码块 不论什么语言都有代码块的概念,C语言中的花括号{ },python中的冒号和缩进.bash中的代码块风格不是非常统一.可是在选择结构中是同样的--反语.if结构使用if...fi标识一个代码块的作用域,而ca

Linux基础之bash脚本编程进阶篇-选择执行语句(if,case)

bash脚本的书写规范简介 看本文需要了解的脚本撰写习惯:bash 开头顶格写#!紧接着写解释器路径/bin/bash 由于bash属于脚本语言,脚本语言的运行方式 解释运行:源代码 --> 运行时启动解释器,由解释器边解释边运行 Linux中的脚本解释器有:zsh,csh,bash,tsh众多shell,不过bash最常用. 第一行写完之后,就可以直接写代码.不过为了便于他人阅读通常会增加如下行: 第二行:#版本信息 第三行:#作者与联系方式 第四行:#版权宣告方式 第五行:#History

bash脚本之case语句应用,while、until和select循环应用及其示例

bash脚本编程: case选择分支结构: case: case 词 in [模式 [| 模式]...) 命令 ;;]... esac 在脚本中使用case的结构: case ${VAR_NAME} in PATTERN1) COMMAND ... ;; PATTERN2) COMMAND ... ;; ... esac 扩展: case ${VAR_NAME} in PATTERN1) COMMAND ... ;; PATTERN2) COMMAND ... ;; *)            

Linux Bash脚本基本语法知识

写在前面:如果此文有幸被某位朋友看见并发现有错的地方,希望批评指正.如有不明白的地方,愿可一起探讨. 前提:读者能够基本使用一款文本编辑器以及了解文件的权限概念. 准备工作 在/home目录创建script文件用于保存所有的脚本程序: # mkdir /home/script # cd /home/script/ Bash脚本的基本输入输出 第一个bash脚本: # vim ./hello-world.sh 说明: "#!"是一个约定标记,它告诉系统这个脚本需要什么解释器来执行 作为可

从此编写 Bash 脚本不再难【转】

从此编写 Bash 脚本不再难 原创 Linux技术 2017-05-02 14:30 在这篇文章中,我们会介绍如何通过使用 bash-support vim 插件将 Vim 编辑器安装和配置 为一个编写 Bash 脚本的 IDE. -- Aaron Kili 本文导航 -什么是 bash-support.vim 插件? …… 05% -如何在 Linux 中安装 Bash-support 插件 …… 10% -如何在 Vim 编辑器中使用 Bash-support 插件 …… 17% -如何为

用Bash脚本将Linux普通用户添加为系统管理员

将Linux普通用户添加为系统管理员在Gnome或KDE这样强大与完善的桌面环境下是非常简单的事情,一般来说在用户设置的对话框里就直接有相应选项.不过,出于简洁与高效的风格,自己目前并未使用这些高端但吃内存的“重量级”桌面环境,使用的就是最基本的X视窗+Sawfish窗口管理器的组合.在这样的环境下进行用户管理,都是通过命令行来完成.如,使用useradd命令添加新用户.不过,由useradd命令添加的用户只具有普通使用者的权限,不具备系统管理的能力.这样一来,就给一些常见的操作带来不便,如,使

Linux应用环境实战10:Bash脚本编程语言中的美学与哲学(转)

阅读目录 一.一切皆是字符串 二.引用和元字符 三.字符串从哪里来.到哪里去 四.再加上一点点的定义,就可以推导出整个Bash脚本语言的语法了 五.输入输出重定向 六.Bash脚本语言的美学:大道至简 总结: 我承认,我再一次地当了标题党.但是不可否认,这一定是一篇精华随笔.在这一篇中,我将探讨Bash脚本语言中的美学与哲学. 这不是一篇Bash脚本编程的教程,但是却能让人更加深入地了解Bash脚本编程,更加快速地学习Bash脚本编程. 阅读这篇随笔,不需要你有Bash编程的经验,但一定要和我一