近期在学习shell编程方面的知识,写的不怎么好,请大家多多指点,下面给大家分享一下shell函数的用法。
我们为什么要用shell函数?
简单的说,函数的作用就是把程序多次调用相同的代码部分定义成一份,然后为这一份代码定义一个名字,其它所有重复调用这部分代码就都只调用定义的这个名字就OK了,当需要修改这部分重复代码时,只需要修改函数体内的一部分代码即可实现所有调用修改。
使用函数的优势:
①把相同的程序定义成函数,可以减少整个程序的代码量
②增加程序的可读性、异读性,以及可管理性。
③可以实现程序功能模块化,不同的程序使用函数模块化。
shell函数的语法:
1 shell函数语法
2 函数名()
3 {
4 指令...
5 return n
6 }
7 或
8 function 函数名() #funcation 表示定义一个函数
9 {
10 指令...
11 return n #输出返回值
12 }
说明:shell的返回值是用exit输出返回值,而函数里用return输出返回值。
【函数带参数的说明】
1:函数体中位置参数($0\$1、$2、$#、$*、$?、$$以及$@)都可以是函数的参数
2:父脚本的参数则临时地被函数参数所掩盖或隐藏
3:$0比较特殊,它仍然是父脚本的名称
4:当函数完成时,原来的命令行参数会恢复
5:在shell函数里面,return命令的功能的工作方式与exit相同,用于跳出函数
6:在shell函数体里使用exit会终止整个shell脚本
7:return语句会返回一个退出值给调用的程序
$0 取脚本的文件名及路径
$1,$2 给脚本传参数
$* 把一堆参数集合成一个参数,传给脚本
$# 一共传了多少个参数
$$ 脚本的pid
$? 上一个脚本执行的返回值
$@ 与$*类似,区别是每个参数是分开的
测试:函数调用
1 [root@bqh-117 scripts]# vim hsdy.sh
2 #!/bin/sh
3 bqh() {
4 echo "I am bqh linux."
5 }
6
7 function jyw() {
8 echo "I am jyw linux."
9 }
10 bqh
11 jyw
解释:我们定义了两个函数,一个bqh,一个jyw,这两个函数里的命令分别为输入"I am bqh linux."和"I am jyw linux.",函数下面最终是调用他们,所有我们执行脚本结果如下:
测试:if传参数用法
1 [root@bqh-117 scripts]# vim hscc.sh
2 #!/bin/sh
3 #no.1
4 [ "$#" -ne 1 ]&&{ #判断用户是否输入了一个网址
5 echo "$0 请输入一个网址!" #取脚本的文件名及路径及请输入一个网址!
6 exit 1
7 }
8 #no.2
9 wget --spider --timeout=8 --tries=2 $1 &>/dev/null #若用户输入传参数是正确的,就执行wget命令
10 if [ "$?" -eq 0 ];then #判断以上命令执行是否有误
11 echo "$1 Httpd is Running... " #若判断以上命令无误,输入用户传参数及检测结果
12 else
13 echo "$1 Httpd is Stoped..." #若判断以上命令有误,输出用户传参数及检测结果
14 exit 2
15 fi
运行脚本效果如下:
接下来我们使用shell函数来实现,如下:
1 [root@bqh-117 scripts]# vim hscc.sh
2 #!/bin/sh
3 #no.1
4 [ "$#" -ne 1 ]&&{ #判断用户是否输入了一个网址
5 echo "$0 请输入一个网址!" #取脚本的文件名及路径及请输入一个网址!
6 exit 1
7 }
8 #no.2
9 wget --spider --timeout=8 --tries=2 $1 &>/dev/null #若用户输入传参数是正确的,就执行wget命令
10 if [ "$?" -eq 0 ];then #判断以上命令执行是否有误
11 echo "$1 Httpd is Running... " #若判断以上命令无误,输入用户传参数及检测结果
12 else
13 echo "$1 Httpd is Stoped..." #若判断以上命令有误,输出用户传参数及检测结果
14 exit 2
15 fi
16 #============================================================================================
17 function chuancan() { #定义一个chuancan函数提醒用户输入一个网址
18 echo "$0 请输入一个网址" #取脚本的文件名及路径及请输入一个网址!
19 exit 1
20 }
21
22 function jc_url() { #定义一个jc_url的函数检测用户输入参数是否正确及检测结果
23 wget --spider --timeout=8 --tries=2 $1 &>/dev/null #若用户输入传参数是正确的,就执行wget命令
24 if [ "$?" -eq 0 ] #判断以上命令执行是否有误
25 then
26 echo "$1 Httpd is Running... " #若判断以上命令无误,输入用户传参数及检测结果
27 else
28 echo "$1 Httpd is Stoped..." #若判断以上命令有误,输出用户传参数及检测结果
29 exit 1
30 fi
31 }
32
33 function panduan() { #定义最后结果的函数
34 if [ "$#" -ne 1 ] #如果用户输入的传参数不是1
35 then #那么
36 chuancan #调用chuancan函数
37 fi
38 jc_url $1 #如果用户输入的传参数是1,那么久调用jc_url 函数
39 }
40
41 panduan $* #把命令行接收的所有参数传给函数内部
我们换一种效果加以对比if脚本和函数脚本:
运行脚本效果如下:
案例实战:利用菜单选项脚本,实现shell函数调用(以安装nginx服务为例)
1 [root@bqh-117 scripts]# vim yjaz.sh
2 #!/bin/sh
3 function menu() { #定义一个菜单函数
4 cat << bqh
5 ++++++++++++++++++++++++++++++++++++++++++++++++++
6 | |
7 | 一键安装服务指南: |
8 | ====================== |
9 | 1、 安装Nginx |
10 | _o0o_ 2、 安装Apache |
11 | 088"."880 3、 安装MySQL |
12 | (|-_-|) 4、 安装PHP |
13 | _.\=/._ 5、部署LNMP环境 |
14 | __/- -\__ 6、安装zabbix监控 |
15 | ‘\ * /‘ 7、退出此服务程序 |
16 | / * \ 8、关闭计算机 |
17 | || * || ====================== |
18 | \\ * // |
19 | ||| b q h ||| |
20 | ___ ___ name: aゞ锦衣卫 |
21 | ___‘. /--.--\ .‘___ date:2019-04-11 |
22 --------------------------------------------------
23 bqh
24 }
25 menu
26
27 if [ ! -d /home/bqh/tools ] #判断是否有/home/bqh/tools目录,没有的话就创建一个
28 then
29 mkdir -p /home/bqh/tools
30 fi
31 azlj_dir=/home/bqh/tools
32
33 read -p "请输入1-8任意数:" num #利用read读取外界传递的参数
34 if [ ${#num} -ne 1 ] #判断读取的参数是否是一个,如果不是给出提示并退出
35 then
36 echo "请输入1|2|3|4|5|6|7|8 任意数"
37 exit 1
38 fi
39
40 expr $num + 1 &>/dev/null #利用expr 检查传递过来的参数是否为整数,并将结果定向空
41
42 if [ "$?" -ne 0 ] #判断上面检查结果是否为0,若不为0给出提示并退出。
43 then
44 echo "请输入数字"
45 exit 1
46 fi
47
48 if [ "$num" -eq 0 ] #判断输入的值是否等于0,若等于给出提示并退出。
49 then
50 echo "请输入比0大的整数"
51 exit 1
52
54 elif [ "$num" -gt 8 ] #判断输入的值是否大于8,若大于给出提示并退出。
55 then
56 echo "请输入比9小的整数"
57 exit 1
58 fi
59 #=======================================
60 function nginx_az () { #定义nginx安装函数。
61 yum install -y zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel &>/dev/null
62 if [ $? -eq 0 ]
63 then
64 cd $azlj_dir && wget -q http://nginx.org/download/nginx-1.6.3.tar.gz &>/dev/null && \
65 groupadd -r nginx && \
66 useradd -s /sbin/nologin -g nginx -M nginx && \
67 tar zxf nginx-1.6.3.tar.gz && \
68 ./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module -
69 -with-http_stub_status_module &>/dev/null && \ make && make install &>/dev/null
70 fi
71 if [ -e /application/nginx/sbin/nginx ]
72 then
73 ln -s /application/nginx-1.6.3/ /application/nginx && /application/nginx/sbin/nginx && \
74 echo "nginx 安装成功并启动!"
75 fi
76 }
77
78 if [ $num -eq 1 ] #如果输入1值时,给出相应提示并调用nginx_az函数。
79 then
80 echo "开始安装nginx请稍等..." && nginx_az
81 fi
执行脚本效果如下:
以上脚本首先是通过if判断用户输入的值是否符合条件,后面函数定义安装nginx,最后调用函数一键安装。