一、Shell函数基本介绍
1.什么是函数?
函数其实就是一堆命令的集合,用来完成特定的功能代码块,方便后期调用。
2.函数的作用
函数可以将代码进行模块化,便于后期的代码的复用,增加脚本的可读性
函数和变量类似,先定义,后引用,直接写函数名就能直接引用 不引用就不会执行函数
二、定义函数格式
定义函数有两种方式
1.方式一
函数名() { command1 command2 ..... }
2.方式二
function 函数名 { command1 command2 ........ }
三、函数的语法示例
[root@xian ~]# fun1() { echo "lixian"; echo "hen nice"; } [root@xian ~]# fun1 lixian hen nice
[root@xian /server/scripts]# cat fun1.sh #!/bin/bash # File Name: fun1.sh # Author: lixian ####################### #定义函数 fun1() { echo "当前系统磁盘信息:"; df -h; } #引用函数 fun1 [root@xian /server/scripts]# sh fun1.sh 当前系统磁盘信息: Filesystem Size Used Avail Use% Mounted on /dev/sda3 18G 2.5G 16G 14% / devtmpfs 476M 0 476M 0% /dev tmpfs 487M 0 487M 0% /dev/shm tmpfs 487M 7.6M 479M 2% /run tmpfs 487M 0 487M 0% /sys/fs/cgroup /dev/sda1 1014M 127M 888M 13% /boot tmpfs 98M 0 98M 0% /run/user/0
四、 函数的参数传递
[root@xian /server/scripts]# cat fun2.sh #!/bin/bash # File Name: fun2.sh # Author: lixian ####################### fun1() { echo "$1 $2" #只接收调用函数的第一个和第二个位置参数 } fun1 $1 $2 $3 #只接收脚本输入的第一个、第二个和第三个位置参数 fun1 $1 $1 #只接收脚本输入的第一个和第一个参数 fun1 $3 $3 #只接收脚本输入的第三个和第三个参数 [root@xian /server/scripts]# sh fun2.sh aaa bbb ccc aaa bbb aaa aaa ccc ccc
五、使用函数编写计算器脚本
[root@xian /server/scripts]# cat jisuan.sh #!/bin/bash # File Name: jisuan.sh # Author: lixian ####################### fun1() { case $2 in +|-|%|^) awk "BEGIN{print $1 $2 $3}" ;; x) awk "BEGIN{print $1 * $3}" ;; ÷) awk "BEGIN{print $1 / $3}" ;; *) echo "错误!你的第二个参数不是操作符!" exit esac } if [ $# -ne 3 ];then echo "错误!你的操作符不是三个!重新输入!" fi echo "$1 $2 $3 = `fun1 $1 "$2" $3`" [root@xian /server/scripts]# sh jisuan.sh 10 + 2 10 + 2 = 12 [root@xian /server/scripts]# sh jisuan.sh 9 - 3 9 - 3 = 6 [root@xian /server/scripts]# sh jisuan.sh 2 x 7 2 x 7 = 14 [root@xian /server/scripts]# sh jisuan.sh 12 ÷ 3 12 ÷ 3 = 4 [root@xian /server/scripts]# sh jisuan.sh 12 % 7 12 % 7 = 5 [root@xian /server/scripts]# sh jisuan.sh 3 ^ 5 3 ^ 5 = 243 [root@xian /server/scripts]# sh jisuan.sh 12 ÷ 7 12 ÷ 7 = 1.71429
六、使用函数编写Nginx启动脚本
1.脚本代码
[root@xian /server/scripts]# cat nginx.sh #!/bin/bash # File Name: nginx.sh # Author: lixian ####################### #调用函数库 [ -f /etc/init.d/functions ] && source /etc/init.d/functions #判断是否为root用户 if [ $USER != "root" -o $UID -ne 0 ];then action "错误:当前用户${USER}没有权限执行脚本!" /bin/false exit fi #判断位置变量是否存在且只有一个 if [ $# -ne 1 ];then action "Usage: $0 {start|stop|status|restart|reload}" /bin/false exit fi #加锁机制 Suo=/tmp/nginx.lock if [ -f $Suo ];then action "此脚本${0}正在执行中!" /bin/false exit fi touch $Suo &>/dev/null #编写函数 State=$1 Pid_File=/var/run/nginx.pid #定义返回状态的函数 Return() { if [ $? -eq 0 ];then action "Nginx服务 $State 成功!" /bin/true else action "Nginx服务 $State 失败!" /bin/false fi } #编写语法错误函数 Syntax_Err() { local Err_Log=/tmp/nginx_err.log /usr/sbin/nginx -t &>$Err_Log Err_File=$(awk -F '[ :]' 'NR==1{print $(NF-1)}' $Err_Log) Err_Line=$(awk -F '[ :]' 'NR==1{print $NF}' $Err_Log) /usr/sbin/nginx -t action "检查Nginx配置文件错误!文件为:$Err_File,错误的行为第 $Err_Line 行!" /bin/false read -p "请问你是否选择进行修改配置文件[Yes|No]: " Confirm case $Confirm in y|Y|Yes|yes) vim +$Err_Line $Err_File /usr/sbin/nginx -t &>/dev/null if [ $? -eq 0 ];then State_1() { /usr/sbin/nginx &>/dev/null && sleep 3 } State_2() { /usr/sbin/nginx -s reload &>/dev/null && sleep 3 } if [ $State == "start" ];then State_1 Return fi if [ $State == "reload" ];then State_2 Return fi if [ $State == "stop" -o $State == "restart" ];then /usr/sbin/nginx -s stop &>/dev/null && sleep 3 Return fi else action "Nginx配置文件错误!" /bin/false fi ;; n|N|No|NO) echo "你选择不进行修改配置文件!" ;; *) echo "你输入的不符合要求!" esac } #编写启动函数 Start() { if [ -f $Pid_File ];then action "Nginx服务正在运行中!" /bin/true else /usr/sbin/nginx -t &>/dev/null if [ $? -eq 0 ];then /usr/sbin/nginx &>/dev/null && sleep 3 Return else action "Nginx配置文件错误!" /bin/false Syntax_Err fi fi } #编写停止函数 Stop() { if [ -f $Pid_File ];then /usr/sbin/nginx -t &>/dev/null if [ $? -eq 0 ];then /usr/sbin/nginx -s stop &>/dev/null && sleep 3 Return else Syntax_Err fi else action "Nginx服务未在运行!" /bin/true fi } #编写状态函数 Status() { if [ -f $Pid_File ];then action "Nginx服务正在运行中!" /bin/true else action "Nginx服务未在运行!" /bin/true fi } #编写重启函数 Restart() { if [ -f $Pid_File ];then local State=stop Stop local State=start Start else action "Nginx服务未在运行!" /bin/true Start fi } #编写平滑重启操作 Reload() { if [ -f $Pid_File ];then /usr/sbin/nginx -t &>/dev/null if [ $? -eq 0 ];then /usr/sbin/nginx -s reload &>/dev/null && sleep 3 Return else Syntax_Err fi else action "Nginx服务未在运行!不能重启!" /bin/false fi } #编写case语句 case $1 in start) Start ;; stop) Stop ;; status) Status ;; restart) Restart ;; reload) Reload ;; *) echo "Usage: $0 {start|stop|status|restart|reload}" esac #解锁 rm -f $Suo
2.执行结果
[root@xian /server/scripts]# sh nginx.sh Usage: nginx.sh {start|stop|status|restart|reload} [ 失败 ] [root@xian /server/scripts]# sh nginx.sh start Nginx服务正在运行中! [ 成功 ] [root@xian /server/scripts]# sh nginx.sh status Nginx服务正在运行中! [ 成功 ] [root@xian /server/scripts]# sh nginx.sh stop Nginx服务 stop 成功! [ 成功 ] [root@xian /server/scripts]# sh nginx.sh restart Nginx服务未在运行! [ 成功 ] Nginx服务 restart 成功!