06.Shell函数应用

徐亮伟, 江湖人称标杆徐。多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型电商运维工作。
个人博客"徐亮伟架构师之路"累计受益数万人。
笔者Q:552408925、572891887
架构师群:471443208

0.Shell中函数的作用

1.命令合集,完成特定功能的代码块
2.在shell中定义函数可以使用代码模块化, 便于复用代码,加强可读性
3.函数和变量类似, 先定义才可调用,如果定义不调用则不会被执行

传参 $1,$2
变量 local
返回值 return $?

1.Shell如何定义函数

# 方式一
函数名() {
    command
}

# 方式二
function 函数名 { 
    command
}

2.Shell如何调用函数

调用函数非常简单, 只需要在脚本中写入函数的名称即可

// 在脚本中直接写入函数名即可完成函数调用
function_name

//函数传参
fun $1  传入脚本后第一个参数
fun $*  接收所有参数的传递

3.Shell中定义函数与调用示例1

//1.定义一个函数
fun01(){
num=10
for i in $(seq $num)
do
     total=$[$i + $num]
done
    echo "计算结果是: $total"
}
//2.调用函数
fun01
//3.执行Shell脚本结果
[root@Shell ~]# sh fun.sh
计算结果是: 20


####修改后1版
//1.定义一个函数
fun01(){
for i in $(seq $num)
do
     total=$[$i + $num]
done
    echo "计算结果是: $total"
}
//2.给num传递值
num=10
//3.调用函数
fun01
//4.执行Shell脚本结果
[root@Shell ~]# sh fun.sh
计算结果是: 20


####修改后2版
//1.定义一个函数
fun01(){
//2.num接收$1的传参
num=$1
for i in $(seq $num)
do
     total=$[$i + $num]
done
    echo "计算结果是: $total"
}
//3.将脚本的位置参数传递给函数
fun01 $1
//4.执行Shell脚本结果
[root@Shell ~]# sh fun.sh 10
计算结果是: 20


####修改后3版
//1.定义一个函数
fun01(){
//2.num接收$1的传参
num=$1
for i in $(seq $num)
do
     total=$[$i + $num]
done
    echo "计算结果是: $total"
}
//3.将脚本的位置参数传递给函数
fun01 $1
fun01 $2
fun01 $3
//4.执行Shell脚本结果
[root@Shell ~]# sh fun.sh  5 10 20
计算结果是: 10
计算结果是: 20
计算结果是: 40

4.Shell中函数的位置参数传递

# 脚本执行有自己的位置参数, 函数也有自己的位置参数, 可以将两者发生互动。

#1.定义函数,接收三个位置参数
fun3() {
    echo "$(($1 * $2 * $3))"
}
#result=`fun3 2 3 4`
#2.将位置参数传递给函数
result=`fun3 $1 $2 $3`
echo "result is: $result"

######修改版
#1.定义函数,接收三个位置参数
fun3() {
    echo "$(($num1 * $num2 * $num3))"
}
num1=$1
num2=$2
num3=$3
result=`fun3 $num1 $num2 $num3`
echo "result is: $result"


###函数传参使用场景
source /etc/init.d/functions
Test() {
    if [ $? -eq 0 ];then
        action "Nginx $1 is ok" /bin/true
    else
        action "Nginx $1 is error" /bin/false
    fi
}
case $1 in
    start)
        nginx
        Test $1
        ;;
    stop)
        nginx -s stop
        Test $1
        ;;
    reload)
        nginx -s reload
        Test $1
        ;;
    *)
        echo "USAGE: $0 { start|stop|reload }"
esac

5.Shell的函数返回值,也算是退出的状态

# echo 返回函数返回值
# return 返回指定函数退出状态码

fun2() {
echo 100
return 1
}
result=`fun2`
echo "函数的状态码是: $?"
echo "函数的返回值是: $result"


###例子
[root@ansible-node30 nginx]# cat fun1.sh

file=/etc/ttt               # 定义文件
t_file(){                   # 函数判断
    if [ -f $file ];then
        return 0
    else
        return 1
    fi
}
# 调用函数
t_file

#根据函数返回状态码进行输出
if [ $? -eq 0 ];then
    echo "该文件存在 $file"
else
    echo "该文件不存在 $file"
fi


##例子: 
1.如果用户输入的数值大于0且小于10则返回0
2.如果用户输入的数值大于等于10且小于20则返回1
3.如果用户输入的数值大于等于20且小于30则返回2
4.输入其余数值则返回3
checknum(){
    read -p "请输入对应的数字:" num
    if [ $num -ge 0 -a $num -lt 10 ];then
        return 0
    elif [ $num -ge 10 -a $num -lt 20 ];then
        return 1
    elif [ $num -ge 20 -a $num -lt 30 ];then
        return 2
    else
        return 3
    fi
}
# 调用函数
checknum
# 保存当时$?的返回值
Rtv=$?
#根据返回值进行判断
if [ $Rtv -eq 0 ];then
    echo "你输入的数字大于0小于10"
elif [ $Rtv -eq 1 ];then
    echo "你输入的数字大于10小于20"
elif [ $Rtv -eq 2 ];then
    echo "你输入的数字大于20小于30"
fi

6.Shell中函数相关使用场景和案例

1.所有脚本必须有选择菜单
2.所有的危险操作均需给出提示

1.编写系统初始化脚本

配置 YUM
安装 Nginx 
q 键退出程序

2.编写虚拟机管理脚本

安装虚拟机 
关闭虚拟机 
打开虚拟机 
克隆虚拟机(可以指定克隆的数量) 
q键退出程序

3.编写系统管理工具箱

查看内存的使用情况 
查看磁盘的使用情况 
查看系统的负载 
q 键退出程序