Shell-day11
1. 上周回顾
1. Shell编程介绍
2. 什么是Shell,为什么学习Shell,任何学习好Shell,Shell能干什么
3. Shell的开发规范习惯,Shell的执行方式
4. 登录式Shell和非登录式Shell 交互式 非交互式
5. Shell的变量介绍
6. 用户自定义变量 环境变量 位置变量 预定义变量
7. 变量的定义实战
8. Shell变量的read复制
9. Shell的变量替换
10. Shell的变量运算
11. 流程控制语句介绍
12. 流程控制语句之文件比较
13. 流程控制语句之整数比较
14. 函数库的应用
15. 流程控制语句之字符比较
16. 流程控制语句之多条件比较
17. 流程控制语句之正则比较
18. 流程控制语句之case语句
19. 循环语句之For循环
20. For循环取值方式
21. 循环语句之while循环
22. 循环语句之until循环
23. 跳出循环的内置指令
2. Shell函数基本介绍
什么是函数?
函数其实就是一堆命令的集合,用来完成特定的功能代码块,方便后期调用。
函数的作用:
函数可以将代码进行模块化,便于后期的代码的复用,增加脚本的可读性
函数和变量类似,先定义,后引用,直接写函数名就能直接引用 不引用就不会执行函数
3. 函数的语法示例
#1. 如何定义函数 定义函数有两种方式
#方式一
函数名() {
command1
command2
.....
}
变量名=值 command
#方式二
function 函数名 {
command1
command2
........
}
#定义函数
[root@qls ~]# fun1() { echo "hello";}
#调用函数
[root@qls ~]# fun1
hello
[root@qls ~]# fun2() { echo "hello"; echo $USER ;}
[root@qls ~]# fun2
hello
root
[root@qls ~]# function fun3 { echo "test"; }
[root@qls ~]# fun3
test
[root@qls ~]# function fun4 { echo "Test";echo $UID;}
[root@qls ~]# fun4
Test
0
[root@qls /service/scripts/day11]# cat fun-1.sh
#!/bin/bash
#定义函数
fun1() {
echo "Test"
}
#调用函数
fun1
[root@qls /service/scripts/day11]# sh fun-1.sh
Test
[root@qls /service/scripts/day11]# cat fun-2.sh
#!/bin/bash
#定义函数
function fun1 {
echo "Test"
}
#引用函数
fun1
[root@qls /service/scripts/day11]# sh fun-2.sh
Test
4. 函数的参数传递
函数参数传递跟脚本类似 都是使用$1 $2 .. $9 ....
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
echo "$1" #函数的第一个位置参数
}
fun1 $1 #脚本将第一个位置参数传递给函数
[root@qls /service/scripts/day11]# sh fun-3.sh test
test
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
echo "$1"
}
fun1 hello
[root@qls /service/scripts/day11]# sh fun-3.sh
hello
#函数使用变量
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
echo "$Num"
}
Num=1
fun1
[root@qls /service/scripts/day11]# sh fun-3.sh
1
#函数中使用局部变量
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
local Num=1
echo "$Num"
}
fun1
echo "变量Num值为: $Num"
[root@qls /service/scripts/day11]# sh fun-3.sh
1
变量Num值为:
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
echo "$Num"
}
Num=$1 #将脚本的第一个位置参数传递给变量Num
fun1
[root@qls /service/scripts/day11]# sh fun-3.sh test
test
#传递多个参数
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
echo "$1" #接收函数的传递的第一个位置变量
}
fun1 $1 #接收脚本的第一个位置变量,传入到函数算第一个位置变量
fun1 $2 #接收脚本的第二个位置变量,传入到函数算第一个位置变量
fun1 $3 #接收脚本的第三个位置变量,传入到函数算第一个位置变量
[root@qls /service/scripts/day11]# sh fun-3.sh 123 456 789
123
456
789
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
echo "$1" #接收函数的第一个位置参数
}
fun1 $1 $2 $3 #接收脚本的第一个第二个第三个位置变量 传递给函数也是三个位置
fun1 $3 #接收脚本第三个位置变量,传递给函数为第一个位置变量
fun1 $2 #接收脚本第二个位置变量,传递给函数为第一个位置变量
[root@qls /service/scripts/day11]# sh fun-3.sh 123 456 789
123
789
456
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
echo "$1 $2 $3"
}
Test=$(fun1 $1 $2 $3)
echo $Test
[root@qls /service/scripts/day11]# sh fun-3.sh 123 456 789
123 456 789
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
echo "$*" # 或者 $@
}
Test=$(fun1 $*)
echo $Test
[root@qls /service/scripts/day11]# sh fun-3.sh 123 456 789
123 456 789
[root@qls /service/scripts/day11]# sh fun-3.sh 123 456 789 abc cba
123 456 789 abc cba
[root@qls /service/scripts/day11]#
函数的位置变量跟脚本的位置变量作用是类似的,但是函数的位置变量不等于脚本的位置变量,脚本的位置变量不等于函数的位置变量,两者不能混为一谈。
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
Test=hello
echo "$Test"
}
fun1
echo "Test变量值为:$Test"
[root@qls /service/scripts/day11]# sh fun-3.sh
hello
Test变量值为:hello
[root@qls /service/scripts/day11]# vim fun-3.sh
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
local Test=hello
echo "$Test"
}
fun1
echo "Test变量值为:$Test"
[root@qls /service/scripts/day11]# sh fun-3.sh
hello
Test变量值为:
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
Test=hello
echo "$Test"
}
echo "Test变量值为:$Test"
[root@qls /service/scripts/day11]# sh fun-3.sh
Test变量值为:
函数中调用局部变量时,一定要加上local 使用全局变量时,将变量定义在脚本中,而不是函数中,变量一定要定义在调用函数的前面。
[root@qls /service/scripts/day11]# cat fun-3.sh
#!/bin/bash
fun1() {
echo "$Test"
}
fun1
Test=hell0
echo "Test变量值为:$Test"
[root@qls /service/scripts/day11]# sh fun-3.sh
Test变量值为:hell0
5. 函数参数传递案例
#编写一个计算器脚本,使用函数实现
执行脚本时,需要在脚本后面加上计算的数字及操作符
sh scripts 1 + 1
执行结果
1 + 1 = 2
sh scripts 1 - 1
1 - 1 = 0
#第一种
[root@qls /service/scripts/day11]# cat fun-4.sh
#!/bin/bash
Cale() {
awk "BEGIN{print $1 $2 $3}"
}
if [ $# -ne 3 ];then
echo "你输入的参数不等于3个!请重新输入!例:1 + 1"
exit
fi
echo "$1 $2 $3 = $(Cale $1 "$2" $3)"
[root@qls /service/scripts/day11]# sh fun-4.sh
你输入的参数不等于3个!请重新输入!例:1 + 1
[root@qls /service/scripts/day11]# sh fun-4.sh 1 * 1
你输入的参数不等于3个!请重新输入!例:1 + 1
[root@qls /service/scripts/day11]# sh fun-4.sh 1 \* 1
1 * 1 = 1
[root@qls /service/scripts/day11]# sh fun-4.sh 1 \* 5
1 * 5 = 5
[root@qls /service/scripts/day11]# sh fun-4.sh 1 / 5
1 / 5 = 0.2
[root@qls /service/scripts/day11]# sh fun-4.sh 1 ^ 5
1 ^ 5 = 1
[root@qls /service/scripts/day11]# sh fun-4.sh 2 ^ 5
2 ^ 5 = 32
[root@qls /service/scripts/day11]# sh fun-4.sh 2 % 5
2 % 5 = 2
[root@qls /service/scripts/day11]# sh fun-4.sh 9 % 5
9 % 5 = 4
#第二种
[root@qls /service/scripts/day11]# cat fun-5.sh
#!/bin/bash
Cale() {
case $2 in
+|-|/|%|^)
awk "BEGIN{print $1 $2 $3}"
;;
x)
awk "BEGIN{print $1 * $3}"
;;
*)
echo "你输入的第二个位置参数不是一个操作符!请重新输入"
exit
esac
}
if [ $# -ne 3 ];then
echo "你输入的参数不等于3个!请重新输入!例:1 + 1"
exit
fi
echo "$1 $2 $3 = $(Cale $1 $2 $3)"
[root@qls /service/scripts/day11]# sh fun-5.sh
你输入的参数不等于3个!请重新输入!例:1 + 1
[root@qls /service/scripts/day11]# sh fun-5.sh 1 + 1
1 + 1 = 2
[root@qls /service/scripts/day11]# sh fun-5.sh 1 - 1
1 - 1 = 0
[root@qls /service/scripts/day11]# sh fun-5.sh 1 / 1
1 / 1 = 1
[root@qls /service/scripts/day11]# sh fun-5.sh 1 % 1
1 % 1 = 0
[root@qls /service/scripts/day11]# sh fun-5.sh 2 ^ 1
2 ^ 1 = 2
[root@qls /service/scripts/day11]# sh fun-5.sh 2 * 1
你输入的参数不等于3个!请重新输入!例:1 + 1
[root@qls /service/scripts/day11]# sh fun-5.sh 2 \* 1
2 * 1 = 你输入的第二个位置参数不是一个操作符!请重新输入
[root@qls /service/scripts/day11]# sh fun-5.sh 2 x 1
2 x 1 = 2
[root@qls /service/scripts/day11]# sh fun-5.sh 2 x 4
2 x 4 = 8
6. 使用函数编写Nginx启动脚本
/usr/sbin/nginx
[root@qls /service/scripts/day11]# cat fun_nginx.sh
#!/bin/bash
#引用函数库
[ -f /etc/init.d/functions ] && source /etc/init.d/functions
#判断当前用户是否为某某用户
if [ $USER != "root" -o $UID -ne 0 ];then
echo "当前用户${USER}对此脚本${0}没有权限执行!"
exit
fi
#判断位置变量是否存在且只有一个
if [ $# -ne 1 ];then
echo "Usage: $0 {start|stop|status|restart|reload}"
exit
fi
#加锁机制
Suo=/tmp/nginx.lock
if [ -f $Suo ];then
echo "此脚本${0}正在执行中!请稍后再执行....."
exit
fi
touch $Suo &>/dev/null
#编写函数
State=$1
Pid_File=/var/run/nginx.pid
#定义返回状态的函数
Return() {
if [ $? -eq 0 ];then
action "Nginx Service $State Successfully!" /bin/true
else
action "Nginx Service $State Failed!" /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
echo "Nginx Syntax Check Failed!Error File is $Err_File,Error Line is $Err_Line"
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 Service Syntax Error!" /bin/false
fi
;;
n|N|No|NO)
echo "你选择不进行修改配置文件!"
;;
*)
echo "你输入的不符合要求!"
esac
}
#编写启动函数
Start() {
if [ -f $Pid_File ];then
action "Nginx Service is Running....." /bin/true
else
/usr/sbin/nginx -t &>/dev/null
if [ $? -eq 0 ];then
/usr/sbin/nginx &>/dev/null && sleep 3
Return
else
action "Nginx Service Syntax Error!" /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 Service is Not Running....." /bin/true
fi
}
#编写状态函数
Status() {
if [ -f $Pid_File ];then
action "Nginx Service is Running....." /bin/true
else
action "Nginx Service is Not Running....." /bin/true
fi
}
#编写重启函数
Restart() {
if [ -f $Pid_File ];then
local State=stop
Stop
local State=start
Start
else
action "Nginx Service is Not Running....." /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 Service is Not Running!Unable to Reload!" /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