shell脚本编程之函数

函数:function

过程式编程:代码重用

模块化编程

结构化编程

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

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

函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码;

语法一:

function  f_name  {

...函数体...

}

语法二:

f_name()  {

...函数体...

}

函数的生命周期:每次被调用时创建,返回时终止;

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

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

return [0-255]

0: 成功

-255: 失败

示例:给定一个用户名,取得用户的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 ;;
    stop)
        stop ;;
    restart)
        stop
        start ;;
    status)
        status ;;
    *)
        usage
        exit 1 ;;
esac

函数返回值:

函数的执行结果返回值:

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

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

函数的退出状态码:

(1) 默认取决于函数体中执行的最后一条命令的退出状态码;

(2) 自定义:return

函数可以接受参数:

传递参数给函数:

在函数体中当中,可以使用$1,$2, ...引用传递给函数的参数;还可以函数中使用$*或[email protected]引用所有参数,$#引用传递的参数的个数;

在调用函数时,在函数名后面以空白符分隔给定参数列表即可,例如,testfunc  arg1 arg2 arg3 ...

示例:添加10个用户,

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

#!/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

变量作用域:

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

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

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

示例程序:

#!/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*(n-1)!=n*(n-1)*(n-2)!=

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

实现如下数列:

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
时间: 2024-10-07 16:21:03

shell脚本编程之函数的相关文章

Linux中的shell脚本编程——函数

概述: 本章节将总结while,for循环语句的特殊用法,在不同的场景当中,更能发挥其功能和价值.除此之外,还会介绍一种特殊的循环语句select语句,实现菜单的作用.最重要的是讲解shell脚本编程中函数的用法.这些内容都要熟练掌握. 一.循环语句的特殊用法: 1.while循环的特殊用法(遍历文件的每一行): □语法:while read line; do 循环体 done < /PATH/FROM/SOMEFILE □意义:依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将

shell脚本编程的选择分支结构

选择执行结构: if语句单分支结构:如果条件为真,则执行then后的命令,否则,不做任何操作: if CONDITION :then STATEMENT fi 或 if CONDITION ; then STATEMENT1 STATEMENT2 ... fi 注意:想要执行then后面的STATEMENTS,前提条件是CONDITION部分为真: if语句的双分支结构:如果条件为真,就执行then后面的命令:否则就执行else后面的命令: if CONDITION ; then STATEME

8.17_Linux之bash shell脚本编程入门篇(三)之循环以及函数function的使用

bash shell脚本编程入门篇(三)之循环 什么是循环执行? 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 相关命令:for, while, until,selet, for命令的使用 作用: 依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束 命令格式: for 变量名 in 列表; do 循环体(正常执行的执行命令) 语句1 语句2 语句3 ... done 列表生成方式: (

Shell脚本编程知识点总结及范例

 一:关于语言 1)编译性语言 编译型语言多半运作于底层,所处理的是字节.整数.浮点数或其它及其机器层经的对象.处理过程为:源程序--预处理--编译--汇编--链接,编译性语言为静态语言. 2)解释性语言 解释性语言读入程序代码并将其转化为内部的形式加以执行.处理过程:解释性(文本文件)-解释器去读取并执行.解释性语言为动态语言. 二:基础 变量类型 linux脚本中的变量不需要事先声明,而是直接定义使用(这点不同于其他高级编程语言中变量的使用)bash变量类型分为本地变量和环境变量. 本地变量

shell脚本编程的一些好习惯

shell脚本编程的一些好习惯 1.命名规则 脚本命名以.sh结尾,名称尽量见名之意.以下是几种可供参考的脚本命名风格.通过以下清新脱俗的风格,读者能够很easy的明白脚本的作用.         clearlog.sh          ClearLog.sh          clearSql.sh         snmp_install.sh         Monitor.sh 2.脚本信息 为脚本加入生动的信息,比如脚本功能的描述,作者,时间,版本信息等.     #!/bin/ba

Linux系统shell脚本编程——生产实战案例

Linux系统shell脚本编程--生产实战案例     在日常的生产环境中,可能会遇到需要批量检查内网目前在线的主机IP地址有哪些,还可能需要检查这些在线的主机哪些端口是开放状态,因此依靠手工来检查是可以实现,但比较费时费力,所以需要结合shell脚本来实现批量检查的功能,那么今天就来做个小小的实验. 1.开发脚本前准备 一般大家都知道,测试主机是否在线,常用的命令无非就是ping.nmap,因此,首先找一个地址来测试下ping命令的效果 [[email protected] scripts]

Linux 的shell脚本编程

shell脚本编程 程序:指令+数据 程序编辑风格:             过程式:以指令为中心,数据服务于指令             对象式:以数据为中心,指令服务于数据 shell程序:提供了编程能力,解释执行 计算机:运行二进制指令 编程语言: 低级:汇编语言 高级:编译:高级语言-->编译器-->目标代码 java,c#,c,c++ 解释:高级语言-->解释器-->机器代码 shell,per,python 编程逻辑处理方式:           顺序执行      

Shell脚本编程30分钟入门

什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch test_$i.txt done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2行:切换到当前用户的home目录 第3行:创建一个目录shell_tut 第4行:切换到shell_tut目录 第5行:循环条件,一共循环10次 第6行:创建一个test_1…10.txt文件 第7

shell 脚本编程之信号捕捉和主机探测

shell 脚本编程之信号捕捉和主机探测 =============================================================================== 概述: =============================================================================== 主机探测 1.写一个脚本,探测192.168.0.0网段中主机在线状态 [[email protected] bin]# cat