七.shell流程控制-if判断语句
1.shell中的运算
1.1数学比较运算
运算符解释
-eq 等于
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-ne 不等于
1.2 字符串比较运算
运算符解释,注意字符串一定别忘了使用引号引起来
== 等于
!= 不等于
-n 检查字符串的长度是否大于0
-z 检查字符串的长度是否为0
1.3 文件比较与检查
-d 检查文件是否存在且为目录
-e 检查文件是否存在
-f 检查文件是否存在且为文件
-r 检查文件是否存在且可读
-s 检查文件是否存在且不为空
-w 检查文件是否存在且可写
-x 检查文件是否存在且可执行
-O 检查文件是否存在并且被当前用户拥有
-G 检查文件是否存在并且默认组为当前用户组
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧
1.4 逻辑运算
逻辑与运算 &&
逻辑或运算 ||
逻辑非运算 !
逻辑运算注意事项:
逻辑与 或 运算都需要两个或以上条件,逻辑非运算只能一个条件。
口诀:
逻辑与运算 真真为真 真假为假 假假为假
逻辑或运算 真真为真 真假为真 假假为假
逻辑非运算 非假为真 非真为假
5.赋值运算
= 赋值运算符 a=10 name='baism'
2.if语法
2.1 单if语句
适用范围:只需要一步判断,条件返回真干什么或者条件返回假干什么。
if [ condition ] #condition 值为true or false
then
commands
fi
2.2 if-then-else语句
适用范围:两步判断,条件为真干什么,条件为假干什么。
if [ condition ]
then
commands1
else
commands2
fi
2.3 if-then-elif语句
适用范围:多于两个以上的判断结果,也就是多于一个以上的判断条件。
if [ condition 1]
then
commands1
elif [ condition 2]
then
commands2
.......
else
commandsX
fi
3.if高级应用
3.1条件符号使用双圆括号,可以在条件中植入数学表达式
例子如下:
3.2使用双方括号,可以在条件中使用通配符
通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配r开头的字符串
八.shell流程控制-for循环语句
1. for语法
1.1 for语法一
for var in value1 value2 ......
do
commands
done
例子如下:
1.2 for语法二
C式的for命令
for ((变量;条件;自增减运算 ))
do
代码块
done
例子如下:
2.循环控制语句
2.1 sleep N脚本执行到该步休眠N秒
例子如下:
监控主机是否存活的脚本
2.2 continue跳过循环中的某次循环
例子如下:
看段代码吧,默认循环输出1-9,但是使用continue跳过输出5
2.3 break 跳出循环继续执行后续代码
例子如下:
要求用户输入一个字母,当输入Q的时候退出
#!bin/bash
#要求用户输入一个字母,当输入Q的时候退出
for((;;))
do
read -p "char" ch
if [ $ch=="Q" ]
then
#终止本循环
break
#如果循环多层嵌套,循环从里往外排序 1-N
#如果想跳出某层循环 break N
else
echo "你输入的字符是:" $ch
fi
done
九.shell流程控制-while 、until循环介绍
1. while 循环语法
while [ condition ] #注意,条件为真while才会循环,条件为假,while停止循环
do
commands
done
例子如下:
2.until循环语法
和while正好相反,until是条件为假开始执行,条件为真停止执行。
until [ condition ] #注意,条件为假until才会循环,条件为真,until停止循环
do
commands代码块
done
例子如下:
#打印10-20数字
#!/bin/bash
init_num=10
until [ $init_num -gt 20 ]
do
echo $init_num
init_num=$((init_num + 1))
done
#输出
[root@www ~]# sh until1.sh
10
11
12
13
14
15
16
17
18
19
20
十.shell流程控制-case条件判断语句
1.case语法
语法:
case 变量 in
条件1)
执行代码块1
;;
条件2)
执行代码块2
;;
......
esac
注意:每个代码块执行完毕要以;;结尾代表结束,case结尾要以倒过来写的esac来结束。
例子如下:
#!/bin/bash
read -p "NUM: " N
case $N in
1)
echo haha
;;
2)
echo hehe
;;
3)
echo heihei
;;
*)
echo bye
;;
esac
执行输出
[root@www ~]# sh x1
NUM: 1
haha
[root@www ~]# sh x1
NUM: 2
hehe
[root@www ~]# sh x1
NUM: 3
heihei
[root@www ~]# sh x1
NUM: 4
bye
2. shell 特殊变量
特殊参数
1. $*: 代表所有参数,其间隔为IFS内定参数的第一个字元
2. $@: 与*星号类同。不同之处在於不参照IFS
3. $#: 代表参数数量
4. $: 执行上一个指令的返回值
5. $-: 最近执行的foreground pipeline的选项参数
6. $$: 本身的Process ID
7. $: 执行上一个背景指令的PID
8. $_: 显示出最後一个执行的命令
9. $N: shell的第几个外传参数
例子如下:
运行结果如下:
十一.shell函数
1.函数语法
语法一:
函数名 () {
代码块
return N
}
语法二:
function 函数名 {
代码块
return N
}
2.函数的应用
函数名字命名参考变量一节中的变量命名规则,函数调用:定义好函数后,如果想调用该函数,只需通过函数名调用即可。
例子如下:
#!/bin/bash
N1 () {
echo "`date +%F`"
}
N2 () {
echo -e "\t\t\t\twelcome to ayitula"
echo -e "\n"
}
N3 () {
echo "1) 剪子"
echo "2) 石头"
echo "3) 布"
}
N4 () {
echo -e "\n\n\n"
read -p "请输入代码: " DL
}
#方便调整代码执行顺序
N2
#代码重复调用
N1
N1
N3
N4
输出
[root@www ~]# sh x2
welcome to ayitula
2019-02-19
2019-02-19
1) 剪子
2) 石头
3) 布
请输入代码: 1
nginx启动管理脚本案例如下:
#!/bin/bash
#ngingx service manager scripts
#=====================variables
nginxdoc="/usr/local/nginx"
nginxd="$nginxdoc/sbin/nginx"
pid="$nginxdoc/logs/nginx.pid"
conf="$nginxdoc/conf/nginx.conf"
#====================function
mystart () {
if [ -f $pid ] && pstree -p |grep `cat $pid` &>/dev/null;then
echo "nginx already run..."
exit 0
else
if $nginxd ;then
echo -e "nginx start\t\t\t\t[\033[32m OK \033[0m]"
else
echo -e "nginx start\t\t\t\t[\033[31m FAIL \033[0m]"
fi
fi
}
mystop () {
if [ -f $pid ] && pstree -p |grep `cat $pid` &>/dev/null;then
if killall -s QUIT $nginxd;then
echo -e "nginx stop\t\t\t\t[\033[32m OK \033[0m]"
else
echo -e "nginx stop\t\t\t\t[\033[31m FAIL \033[0m]"
fi
else
echo "nginx already stop...."
fi
}
myrestart () {
mystop;sleep 2 ;mystart
}
myreload () {
if [ -f $pid ] && pstree -p |grep `cat $pid` &>/dev/null;then
if killall -s HUP $nginxd;then
echo -e "nginx reload\t\t\t\t[\033[32m OK \033[0m]"
else
echo -e "nginx reload\t\t\t\t[\033[31m FAIL \033[0m]"
fi
else
echo "nginx is stop...."
fi
}
mystatus () {
if [ -f $pid ] && pstree -p |grep `cat $pid` &>/dev/null;then
echo "nginx is open"
else
echo "nginx is stop"
fi
}
#===================main
#calld function
case $1 in
start|START)
mystart
;;
stop) mystop ;;
restart) myrestart ;;
reload) myreload ;;
status) mystatus ;;
esac
注:以上案例来自B站的UP主Python社区,结合博客和视频一起食用,效果更好哦
shell脚本视频链接:Shell脚本