第二课 Shell脚本编程-函数的用法
第一节 函数的定义和使用
- Linux Shell中的函数和大多数编程语言中的函数一样
- 将相似的任务或代码封装到函数中,供其他地方调用
- 调用函数:直接使用函数名调用,可以将其想象成Shell中的一条命令
- 函数内部可以直接使用参数
$1、$2..…..$n
- 调用函数:
function_name $1 $2
# 第一种方法定义函数
[root@localhost ~]# test()
> {
> echo "test function"
> }
[root@localhost ~]# test
test function
# 查看可调用的函数名称和函数内容
[root@localhost ~]# declare -f
test ()
{
echo "test function"
}
# 第二种方法定义函数
[root@localhost ~]# function greeting
> {
> echo "hello zhangsan"
> }
# tab 自动补全可以看到函数
[root@localhost ~]# gre
greeting grep
[root@localhost ~]# greeting
hello zhangsan
# 查看可调用的函数名称
[root@localhost ~]# declare -F
declare -f greeting
declare -f test
第二节 Nginx判断守护进程
# 判断nginx进程是否存在 过滤grep
ps -ef | grep nginx | grep -v grep
# 有时候我们把上面一句化放到脚本中nginx_check.sh
#!/bin/bash
#
ps -ef | grep nginx | grep -v grep
echo $?
# 即使把nginx关掉 依然返回0 因为脚本名称中有个nginx 改下名字check.sh发现正常
# 不改文件名的解决方案 把脚本子进程的pid排除掉
# echo $$ 会把执行脚本 子进程的pid打印出来
#!/bin/bash
#
this_pid=$$
while true
do
ps -ef | grep nginx | grep -v grep | grep -v $this_pid &> /dev/null
if [ $? -eq 0 ];then
echo "Nginx is running well"
else
systemctl start nginx
echo "Nginx is down,Start it"
fi
done
# 后台运行守护脚本
nohup sh nginx_daemon.sh &
第三节 向函数传递参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GegTQDE-1666023882024)(.\printscreen\2.3.png)]
- 直接在函数中$1, $2, $3即可。
- 函数调用:
name Lily Allen
# 函数传参
greeting ()
{
echo "hello $1"
}
# 函数调用
greeting zhangsan
- 加减乘除案例
#!/bin/bash
#
function calcu
{
case $2 in
+)
echo "`expr $1 + $3`"
;;
-)
echo "`expr $1 - $3`"
;;
\*)
echo "`expr $1 \* $3`"
;;
/)
echo "`expr $1 / $3`"
;;
esac
}
# 调用函数
calcu $1 $2 $3
sh calculate.sh 20 + 20
第四节 返回值的方式
- 方法一:return
- 使用return返回值,只能返回1-255的整数
- 函数使用return返回值,通常只是用来供其他地方调用获取状态,因此通常仅返回0或1;0表示成功,1表示失败
- 方法二:echo
- 使用echo可以返回任何字符串结果
- 通常用于返回数据,比如一个字符串值或者列表值
- return的案例
#!/bin/bash
#
this_pid=$$
function 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 # 1失败需要重启
fi
}
is_nginx_running && echo "Nginx is runing" || echo "Nginx is stop"
# 执行脚本
sh nginx_check.sh
# 查看脚本的执行过程
sh -x nginx_check.sh
- echo的案例
#!/bin/bash
#
function get_users
{
users=`cat /etc/passwd | cut -d: -f1`
echo $users
}
user_list=`get users`
index=1
for u in $user_list:
do
echo "The $index user is : $u"
index=$((index+1))
done
第五节 局部变量和全局变量
- 全局变量
- 不做特殊声明,Shell中变量都是全局变量
- Tips:大型脚本程序中函数中慎用全局变量
- 局部变量
- 定义变量时,使用local关键字
- 函数内和外若存在同名变量,则函数内部变量覆盖外部变量
- 全局变量案例
#!/bin/bash
#
var1="Hello world"
function test
{
var2=87
}
echo $var1
echo $var2
test # 被调用后 变量就变成全局变量了
echo $var2
function test1
{
echo $var2
}
# sh var.sh 结果
"Hello world"
""
87
87
- 局部变量案例
#!/bin/bash
#
var1="Hello world"
function test
{
local var2=87
}
echo $var1
echo $var2
test # 被调用后 局部变量不会变成全局变量
echo $var2
# sh var.sh 结果
"Hello world"
""
""
第六节 定义函数库
- 经常使用的重复代码封装成函数文件
- 一般不直接执行,而是由其他脚本调用
- 定义一个函数库,该函数库实现以下几个函数;
- 加法函数add
- 减法函数reduce
- 乘法函数multiple
- 除法函数divide
- 打印系统运行情况的函数sys_load,该函数可以显示内存运行情况, 磁盘的使用情况
- 写简单的库文件
base_function.sh
#!/bin/bash
#
function add
{
echo "`expr $1 + $3`"
}
function reduce
{
echo "`expr $1 - $3`"
}
function mult1ple
{
echo "`expr $1 \* $3`"
}
function divide
{
echo "`expr $1 / $3`"
}
function sys_load
{
echo "Memory Info"
echo
free -m
echo
echo "Disk UseAge"
df -h
echo
}
- 引入库文件, 并使用其中函数。
#!/bin/bash
#
. /home/base_function
add 12 23
reduce 90 30
multiple 12 12
divide 12 2
- 经验之谈
- 库文件名的后缀是任意的,但一般使用.lib
- 库文件通常没有可执行选项
- 库文件无需和脚本在同级目录,只需在脚本中引用时指定
- 第一行一般使用
#!/bin/echo
,输出警告信息,避免用户执行