文章目录
前言
参考视频:shell编程之条件判断与流程控制
参考网站:菜鸟教程
shell编程的变量笔记:shell编程之变量的笔记
一.条件判断式语句
1. 条件判断式语句概述
(1)概述
- 能够做出判断
- 根据条件做出相应的操作
(2)判断格式
#第一种,test 命令用于检查某个条件是否成立
test -e /root/install.log
#第二种
[ -e /root/install.log ]
1.方括号内两边都需要有空格 ;注意空格,比如-e /root/install.log ,-e与/root/install.log之间必须有空格
2.一般使用中括号
3. 使用test命令或执行命令,不能加上[]
2.按文件类型判断
(1)文件类型判断图
[root@Test ~]# [ -d /root ] && echo "yes" || echo "no"
yes
3.按文件权限判断
(1)文件权限判断图
[root@Test ~]# ll
总用量 4
-rw-------. 1 root root 1297 7月 10 20:22 anaconda-ks.cfg
#判断文件是否可读
[root@Test ~]# [ -w ./anaconda-ks.cfg ] && echo "yes" || echo "no"
yes
4.两个文件之间比较
(1)两个文件之间比较图
#创建一个硬链接
[root@Test ~]# ln anaconda-ks.cfg anaconda-ks.link
#比较两个文件的inode节点
[root@Test ~]# [ ~/anaconda-ks.cfg -ef ~/anaconda-ks.link ] && echo "yes" || echo "no"
yes
nt(new than)、ot(old than)、ef(equal file)
5.两个整数之间比较
(1)两个整数之间比较图
[root@Test ~]# aa=100
[root@Test ~]# bb=200
#判断两个数的大小
[root@Test ~]# [ $aa -lt $bb ] && echo "yes" || echo "no"
yes
1.eq(equal)、ne(not equal)、gt(greater than)、lt(less than)、ge(greater than or equal)、le(less than or equal)
2.这是用来判断数值型的,如果使用数值判断容易乱,因为shell默认是字符串型,所以在使用的时候小心点
6.字符串的判断
(1)字符串判断图
[root@Test ~]# a="test"
[root@Test ~]# b=""
[root@Test ~]# [ -z "$b" ] && echo "yes" || echo "no"
yes
#判断字符串相等不建议这么做
[root@Test ~]# [ "$a" = "$b" ] && echo "yes" || echo "no"
no
#判断字符串相等建议这么做
[root@Test ~]# [ "$a" == "$b" ] && echo "yes" || echo "no"
no
[root@Test ~]# aa=100
[root@Test ~]# bb=200
[root@Test ~]# [ $aa -eq $bb ] && echo "yes" || echo "no"
no
#加上双引号就可以当做字符串判断
[root@Test ~]# [ "$aa" == "$bb" ] && echo "yes" || echo "no"
no
1.shell编程的字符串判断相等可以使用“=”,但是不建议那么做,容易产生歧义;
2.注:在判断的时候一定要使用双引号,让它当做字符串来判断
3.以后判断两个变量是否相等,直接使用==号,除非特殊情况,比如写一个计算器
7.多重条件判断
(1)多重条件判断图
[root@Test ~]# aa=11
#判断变量aa是否有值,同时判断变量aa是否大于23;因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假
[root@Test ~]# [ -n "$aa" -a $aa -gt 23 ] && echo "yes" || echo "no"
no
8. 学习小脚本实例的好处
- 掌握语法结构
- 了解shell的作用
- 分析编程思想
9. 建立编程思想的方法
- 熟悉Linux基本命令、规范、语法及shell语法
- 当遇到实际需求时,应用所学知识
10.如何“背”程序
- 抄写老师的程序并正确运行
- 为程序补全注释
- 删掉注释,为代码重新加注释
- 看注释写代码
- 删掉代码和注释,从头开始写
二.单分支if语句
1.单分支if条件语句
#第一种写法
if [ 条件判断式 ];then
fi
#第二种写法
if [ 条件判断式 ]
then
fi
注意点:
1.if语句使用fi结尾,和一般语言使用大括号结尾不同
2.[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
3.then后面跟符号条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了
2.例子1:判断登录的用户是否为root
#!/bin/bash
#为什么不使用“whoami”,因为它会被欺骗,所以推荐使用env
test=$(env |grep "USER" | cut -d "=" -f 2)
if [ "$test" == "root" ];then
echo "当前登录的用户是:root"
fi
3.例子2:判断分区使用率
#!/bin/bash
#获取磁盘使用率
rate=$(df -h |grep "/dev/sda3" |awk '{print $5}'|cut -d "%" -f1)
#判断使用率是否超过80
if [ $rate -gt 80 ];then
echo "/dev/sda3的使用率超过80%了"
fi
三.双分支if条件语句
1.双分支if条件语句格式
if [ 条件判断是式 ]
then
command1
command2
...
commandN
else
command
fi
2.例1:判断用户输入的是不是目录
#!/bin/bash
read -t 30 -p "请输入一个目录:" dir
if [ -d $dir ];then
echo "输入的是目录"
else
echo "输入的不是目录"
fi
3.例2:判断apache是否启动
#!/bin/bash
#centos7环境
test=$(ps aux |grep "httpd" | grep -v grep )
if [ -n "$test" ];then
echo "$(date) httpd is ok"
else
/usr/sbin/httpd
echo "$(date) httpd is not ok"
fi
注意:脚本名称不能包含httpd
四.多分支if语句
1.多分支if语句格式
if [ 条件判断是式 ]
then
command1
command2
...
commandN
elif
then
.....省略更多条件
else
command
fi
2.例1:判断数值的范围
#!/bin/bash
num=10
#num="asds"
#判断num是不是数字
if [ -n $(echo $num |sed "s/[0-9]+//g") ];then
echo "不是数字"
exit 1
fi
#判断数值的范围
if [ $num -gt 100 ];then
echo "大于100"
elif [ $num -le 100 -a $num -gt 50 ];then
echo "大于50且小于等于100"
elif [ $num -le 50 -a $num -ge 0 ];then
echo "大于等于0且小于等于50"
else
echo “小于0”
fi
五.多分支case语句
1.case语句与if语句的相同点和不同点
case语句和if…elif…else语句一样是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系.
2.case语句的格式
case $变量名 in
"值1")
执行程序1
;;
"值2")
执行程序2
;;
*)
如果都不匹配成功就执行这里
;;
esac
注意:每个执行程序后面一定要有“;;”;“*”表示没有匹配到就执行这里
3.例子1:判断用户输入
#!/bin/bash
read -t 30 -p "请输入内容:" input
case $input in
"yes")
echo "yes"
;;
"no")
echo "no"
;;
*)
echo "没有匹配到"
;;
esac
六.for循环语句
1.for语句语法1
for 变量 in 值1 值2 ...
do
执行程序
done
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
2.for语句语法2
for ((初始值;循环控制条件;变量变化))
do
执行程序
done
#!/bin/bash
for((i=1;i<10;i++))
do
echo $i
done
两个括号之间不能有空格
3.例1:批量解压缩文件
#!/bin/bash
cd /root/test/test/
$(ls *.tar.gz > ls.log)
for i in $(cat ls.log)
do
tar -zxf $i &>>/dev/null
done
七.while循环语句和until循环语句
1.while循环语句简介
while循环是不定循环,也称作条件循环,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才停止。这就和for的固定循环不太一样了
2.while循环语句格式
while [ 条件判断式 ]
do
执行程序
done
#!/bin/bash
i=0
while [ $i -le 10 ]
do
echo $i
i=$[$i+1]
done
注意结束条件,不然会出现死循环
3.until循环语句简介
until循环,和while循环相反,until循环时只要条件判断式不成立就进行循环,并执行循环程序。一旦循环条件成立就终止循环
4.until循环语句格式
until [ 条件判断式 ]
do
执行程序
done
#!/bin/bash
i=0
until [ $i -gt 10 ]
do
echo $i
i=$[$i+1]
done
八.break语句和continue语句
1.break语句
#!/bin/bash
i=0
while [ $i -le 10 ]
do
echo $i
i=$[$i+1]
break
done
break是用来跳出当前所有循环,break[n]可以指定跳出几层循环
2.continue语句
#!/bin/bash
i=0
while [ $i -le 10 ]
do
echo $i
i=$[$i+1]
continue
done
它不会跳出所有循环,仅仅跳出当前循环
九.总结
shell编程更多地考虑程序的功能实现,而不是效率;简化管理员的操作
如果是从其它系统复制过来的内容或shell脚本文件出现莫名其妙的错误时有可能是格式的问题,可以使用dos2unix转换,执行“yum install -y dos2unix”进行安装转换工具