0%

Shell函数应用

Shell函数应用

什么是函数

​ 函数其实就是一堆命令的合集,用来完成特定功能的代码块,你可以对它进行自定义命令,并且可以在脚本中任意位置使用这个函数,要使用定义的函数,只需要填写函数名称就可以了。

函数的作用

1.使用函数可以让代码模块化,便于代码的复用,同时增加脚本的可读性。
2.函数和变量类似,必须先定义才可使用,如果定义不调用则不会被执行。

函数基本的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
01. 如何定义Shell函数,可以通过如下两种方式进行定义。


#方式一

函数名() {
command1
command2
...
commandN
}

#方式二

function 函数名 {
command1
command2
...
commandN
}
------------------------------------------------------------------------------------------

02. 如何调用Shell函数,直接使用函数名调用即可。在函数内部也可以使用$1$2..$n的方式传递参数。


#1.命令行定义函数
[root@qiudao /scripts]# fun1() { echo "hello world"; }

#2.命令行调用函数
[root@qiudao /scripts]# fun1
hello world

#给函数传递参数
[root@qiudao /scripts]# fun2() { echo "hello $1"; }
[root@qiudao /scripts]# fun2 linux
hello linux

#4.给函数传递多个参数{$*,接收所有的参数传递}
[root@qiudao /scripts]# fun3() { echo "hello $*"; }
[root@qiudao /scripts]# fun3 zhangsan lisi wangwu
hello zhangsan lisi wangwu

函数参数传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
01. 函数传参示例,使用变量方式传递固定值


[root@qiudao /scripts]# cat fun-1.sh
#!/bin/bash
fun_1() {
echo "$num"
}
num=10 #传递参数
fun_1 #调用函数

#执行脚本
[root@qiudao /scripts]# sh fun-1.sh
10

------------------------------------------------------------------------------------------

02. 函数传参示例,使用变量方式传递可变的值


[root@qiudao /scripts]# cat fun-2.sh
#!/bin/bash
fun_1() {
echo "$num"
}
num=$1 #将脚本的第一个位置参数传递给变量num
fun_1 #调用函数

#执行脚本
[root@qiudao /scripts]# sh fun-2.sh 20
20

------------------------------------------------------------------------------------------

03. 函数传参示例,传递多个位置参数


[root@qiudao /scripts]# cat fun-3.sh
#!/bin/bash
fun_1() {
echo "$1" #接收执行函数是传递的第一个参数
}
fun_1 $1 #接收脚本第一个位置参数,传入函数中算第一个参数
fun_1 $2 #接收脚本第二个位置参数,传入函数中算第一个参数
fun_1 $3 #接收脚本第三个位置参数,传入函数中算第一个参数

#执行脚本
[root@qiudao /scripts]# sh fun-3.sh 10 20 30
10
20
30

[root@qiudao /scripts]# cat fun-3.sh
#!/bin/bash
fun_1() {
echo "$1"
}
fun_1 $1 $2 $3
fun_1 $2
fun_1 $3

[root@qiudao shell]# sh fun.sh 1 2 3
1
2
3

------------------------------------------------------------------------------------------

04. 函数传参示例,传递多个函数参数


[root@qiudao /scripts]# cat fun-4.sh
#!/bin/bash
fun_1() {
echo "$1" "$2" "$3" #函数接收传递三个参数
}
#rc=$(fun_1 10 20 30) #传递固定的值
rc=$(fun_1 $1 $2 $3) #传递可变的值
echo "传递参数的值为,$rc"

#执行脚本
[root@qiudao /scripts]# sh fun-4.sh 10 20 30
传递参数的值为,10 20 30

------------------------------------------------------------------------------------------

05. 函数传参示例,将脚本的位置参数与函数的位置参数发生联动。


[root@qiudao /scripts]# cat fun-5.sh
#!/bin/bash
fun_1() {
echo "$num1" "$num2" "$num3"
}
num1=$1 #将脚本位置参数一的值传递给变量num1
num2=$2 #将脚本位置参数二的值传递变量给num2
num3=$3 #将脚本位置参数二的值传递变量给num3

rc=$(fun_1) #将函数执行的结果保存至rc变量中,便于后续echo输出

echo "传递参数的值为,$rc"

#执行脚本
[root@qiudao /scripts]# sh fun-5.sh 10 20 30
传递参数的值为,10 20 30

函数状态返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#Shell的函数返回值,也算是退出的状态。在Shell中只有echo、return两种方式。

1.使用return返回值:只能返回0-255的整数,函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1;0表示成功,1表示失败。

2.使用echo返回值:使用echo可以返回任何字符串结果,通常用于返回数据,比如一个字符串值或者列表值。

01. Shell函数echoreturn返回值示例

[root@qiudao /scripts]# cat fun_echo_return.sh
#!/bin/bash
fun_echo_return() {
echo 100 #返回函数执行后的数据
return 1 #返回函数执行后的状态码(放置最后)
}

result=`fun_echo_return`

echo "函数的状态码是:$? "
echo "函数的返回值是:$result "

#执行脚本
[root@qiudao /scripts]# sh fun_echo_return.sh
函数的状态码是:1
函数的返回值是:100

------------------------------------------------------------------------------------------

02. Shell函数return返回值使用场景示例

#return示例一:
[root@qiudao /scripts]# cat fun_return.sh
#!/bin/bash
file=/etc/passwd #定义文件
t_file() {
if [ -f $file ];then
return 0
else
return 1
fi
}
#调用函数,并根据函数返回状态码进行输出
t_file && echo "该文件存在 $file" || echo "该文件不存在 $file"

#执行脚本
[root@qiudao /scripts]# sh fun_return.sh
该文件存在 /etc/passwd

#return示例二:(了解即可)
[root@qiudao /scripts]# cat fun_nginx_run.sh
#!/bin/bash
this_pid=$$
is_nginx_running() {
ps -ef|grep nginx |grep -v grep |grep -v $this_pid &>/dev/null
if [ $? -eq 0 ];then
return 0
else
return 1
fi
}
#调用函数,并根据函数返回状态码进行输出
is_nginx_running && echo "Nginx is running" || echo "Nginx is stoped"

函数场景示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#系统初始化版本

[root@qiudao /scripts]# cat system.sh
#!/bin/bash
#1.显示系统版本
check_system_version() {
awk '{print $(NF-1)}' /etc/redhat-release
}

#2.更新yum源
check_yum() {
tt=$(awk '{print $(NF-1)}' /etc/redhat-release)
if [ ${tt%%.*} -eq "6" ];then
mkdir -p /etc/yum.repos.d/backup
\mv /etc/yum.repos.d/.*repo /etc/yum.repos.d/backup/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
elif [ ${tt%%.*} -eq "7" ];then
mkdir -p /etc/yum.repos.d/backup
\mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
fi
yum clean all && yum makecache
}

#3.安装基础软件包
package_install() {
yum install -y net-tools vim tree htop iftop \
iotop lrzsz wget unzip telnet nmap nc ntpdate \
bash-completion bash-completion-extra sysstat rsync nfs-utils -y
}

#4.关闭selinux
disable_selinux() {
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforc 0 &> /dev/null
}

#5.关闭firewalld
disable_firewalld() {
systemctl stop firewalld.service
systemctl disable firewalld.service
}

#6.配置sshd服务
ssh_config() {
sed -i 's/#UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
}
#7.加大文件描述符
limit_conf() {
echo '* - nofile 65535 ' >>/etc/security/limits.conf
}
#8.时间同步
date_time() {
echo '*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' >/var/spool/cron/root
}
menu() {
cat <<EOF
##########################################
## 1、操作系统发行版本 ##
## 2、部署yum源 ##
## 3、安装系统软件包 ##
## 4、关闭Selinux ##
## 5、关闭Firewalld ##
## 6、配置SSHD服务 ##
## 7、加大文件描述符 ##
## 8、同步系统时间 ##
## 9、打印菜单 ##
## q、退出程序 ##
##########################################
EOF
}
#打印菜单
menu
while true
do
read -p "您想干什么?就请输入上面对应的字符:" n
case $n in
1)
check_system_version
;;
2)
check_yum &>/dev/null
echo $? &>/dev/null && echo "yum源更新完成" || echo "yum源更新失败"
;;
3)
echo "安装软件包需要一部分时间,请耐心等待,正在安装中......."
package_install &>/dev/null
echo $? &>/dev/null && echo "基础软件包安装完成" || echo "基础软件包安装报错"
;;
4)
disable_selinux &>/dev/null
echo $? &>/dev/null && echo "Selinux 关闭成功" || echo "Selinux 关闭失败"
;;
5)
disable_firewalld &>/dev/null
echo $? &>/dev/null && echo "Firewalld 关闭成功" || echo "Firewalld 关闭失败"
;;
6)
ssh_config &>/dev/null
echo $? &>/dev/null && echo "sshd服务配置完成" || echo "sshd服务配置报错"
;;
7)
limit_conf &>/dev/null
echo $? &>/dev/null && echo "文件描述符数量修改成功" || echo "文件描述符数量修改失败"
;;
8)
date_time &>/dev/null
echo $? &>/dev/null && echo "定时任务添加成功" || echo "定时任务添加失败"
;;
9)
clear
menu
;;
q)
echo "您即将退出程序!"
exit 1
esac
done