【shell流程控制之条件判断-04】

一、if条件

单分支:

if 条件表达式
then
	命令序列
fi

双分支:

if 条件表达式
then
	命令序列1
else
	命令序列2
fi

多分支:

if 条件表达式1
then
	命令序列1
elif 条件表达式2
then
	命令序列2
elif 条件表达式3
then
	命令序列3
elif 条件表达式n
then
	命令序列n
else
	默认指令序列
fi

1.单分支练习题
1.1 判断是否是数字:

if [ $num -gt 0 ] 2>/dev/null
then
	echo "是数字!"
else
	echo "不是数字!"
fi

判断是否是数字还有其他方法
1.2 判断用户是否存在

[root@manager day4]# cat 双分支2.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-14
#FileName:      双分支2.sh
#*************************************************************
#id hadoop &>/dev/null && echo "hadoop is exists..." || useradd hadoop
if id hadoop &>/dev/null
then
#	echo "用户存在"
#如果用户hadoop存在连同家目录一起删除
	userdel -r hadoop
else
	echo "用户不存在,将为之创建"
#   useradd hadoop
fi

1.3 判断vsftpd是否安装

[root@xixi day4]# cat 双分支3.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-14
#FileName:      双分支3.sh
#*************************************************************
#判断vsftpd是否安装,如果没有安装则安装
if rpm -q vsftpd &>/dev/null
then
	echo "vsftpd already install"
else
	yum install -y vsftpd &>/dev/null
fi
[root@xixi day4]# sh 双分支3.sh
[root@xixi day4]# sh 双分支3.sh
vsftpd already install

1.4 判断httpd服务是否运行:有多种方法

[root@manager day4]# cat 双分支4.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-14
#FileName:      双分支4.sh
#*************************************************************
#判断某个服务是否运行
#1.systemctl satus vsftpd
#2.ps -ef | grep vsftpd | grep -v grep | wc -l
#3.systemctl is-active sshd 判断是否等于active
#  systemctl is-enable sshd 判断是否等于enable
#4.netstat -ltunp | egrep "22|21" | wc -l 判断是否>0
#5.安装nmap yum install -y nmap,然后探测nmap -p 21 127.0.0.1 | grep open| wc -l 判断是否是>0 
if [ $(ps -ef | grep httpd | grep -v grep | wc -l) -gt 0 ]
then
	echo "httpd正在运行"
else
	echo "httpd没有运行"
fi

1.5 判断主机是否可达

[root@manager day4]# cat 双分支5.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-14
#FileName:      双分支5.sh
#*************************************************************
#检测主机是否存活,并输出结果
#使用ping命令
ping -c 2 -i 0.1 -w 0.2 www.sina.com &>/dev/null
if [ $? -eq 0 ]
then 
	echo "可以ping通互联网"
else
	echo "网络不可达"
fi

2.双分支练习题
2.1 判断输入是否大于500

[root@xixi day4]# cat 双分支1.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-14
#FileName:      双分支1.sh
#*************************************************************
read -p "please input num:" n
#[ $n -gt 500 ] && echo "big.sh" || (echo "小于等于500";exit 3)
#或者变量的数学运算判断是否是整数
if let n++
#或者用expr判断是否是整数
#if expr n + 1 2>/dev/null
#正则表达式判断:判断是不是整数
#if [[ $n =~ ^[0-9]+$ ]]
then 
	if [ $n -gt 500 ]
	then
		echo "big.sh"
	else
		echo "小于等于500"
		exit 3
	fi
else
	echo "输入的值不是数字"
fi
[root@xixi day4]# sh 双分支1.sh 
please input num:ss
输入的值不是数字
[root@xixi day4]# sh 双分支1.sh 
please input num:234
小于等于500

3.多分支练习题
3.1 判断输入的成绩属于什么等级

[root@xixi day4]# cat 多分支1.sh 
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-14
#FileName:      多分支1.sh
#*************************************************************
#85-100 优秀--A
#70-84 良好--B
#60-79 合格--C
#60分以下 不合格--D
read -p "请输入成绩:" score
if let score++ 2>/dev/null
then
		if [ $score -ge 0 -a $score -le 100 ]
		then
				if [ $score -ge 85 ]
				then
					echo "A"
				elif [ $score -ge 70 ]
				then
					echo "B"
				elif [ $score -ge 60 ]
				then
					echo "c"
				else
					echo "D"
				fi
		else
			echo "输入的成绩范围应该为0~100"
		fi
else
	echo "输入的不是整数"
fi
[root@xixi day4]# sh 多分支1.sh 
请输入成绩:形势下
输入的不是整数
[root@xixi day4]# sh 多分支1.sh 
请输入成绩:123
输入的成绩范围应该为0~100

3.2 根据用户输入,判断是数字、字母或其他字符

[root@xixi day4]# cat 多分支2.sh 
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-14
#FileName:      多分支2.sh
#*************************************************************
#根据用户输入,判断是数字、字母或其他字符
read -p "请输入一个字符:" str
if [ ${#str} -eq 1 ]
then
	if echo $str | grep '[[:alpha:]]' &>/dev/null
	then
		echo "$str is letter"
	elif echo $str | grep '[[:digit:]]' &>/dev/null
	then
		echo "$str is number"
	else
		echo "$str is other"
	fi
else
	echo "输入错误,请输入一个字符"
	exit 3
fi
[root@xixi day4]# sh 多分支2.sh
请输入一个字符:1
1 is number
[root@xixi day4]# sh 多分支2.sh
请输入一个字符:w
w is letter
[root@xixi day4]# sh 多分支2.sh
请输入一个字符:
输入错误,请输入一个字符
[root@xixi day4]# sh 多分支2.sh
请输入一个字符:ww
输入错误,请输入一个字符

练习题:shell if判断
示例1:写一个脚本程序,给定一个用户,判断其UID与GID是否一样,如果一样,就显示该用户为“good guy”,否则显示为“bad guy”
示例2:判断命令历史中历史命令的总条目是否大于1000,如果大于,则显示“some command will gone”,否则显示OK
示例3:给定一个文件,如果是普通文件,就显示出来,如果是目录文件,也显示出来,否则就显示“无法识别”
示例4:写一个脚本,能接受一个参数(文件路径),判断这个参数如果是一个存在的文件就显示“ok”,否则显示“No such file"

示例5:判断当前系统上是否有用户的默认shell程序是否为bash程序,如果有,就显示有多少个这类用户,否则就显示没有这类用户;并且显示出那些用户是bash

示例6:写出一个脚本程序,给定一个文件,比如:/etc/inittab
a、判断这个文件中是否有空白行?
b、如果有,则显示其空白行的行号,否则显示没有空白行
示例7:写一个脚本
(1) 获取当前主机的主机名,保存于host_name变量中;
(2) 判断此变量的值是否为localhost,如果是,则将当前主机名修改为www.openlab.com;
(3) 否则,则显示当前主机名;

示例8:写一个脚本,完成如下功能
(1) 传递一个磁盘设备文件路径给脚本,判断此设备是否存在;
(2) 如果存在,则显示此设备上的所有分区信息;

注:shell生成随机数
yum -y install pwgen
pwgen -ncC 8 1
pwgen -ncyC 8 1

二、多条件判断语句case

case 变量名 in
	值1)
	   指令1
	;;2)
	   指令1
	;;3)
	   指令3
	;;
	*)
	   默认
esac

练习:判断输入的值是否为yes还是no

[root@manager day4]# cat 多分支3.sh 
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-20
#FileName:      多分支3.sh
#*************************************************************
read -p "please input yes or no:" answer

case "$answer" in
	"yes")
		echo y
		;;
	"no")
		echo n
		;;
	*)
		;;
esac

打印多行:
cat << EOF
.
.
.
EOF

[root@manager day4]# cat menu.sh
#!/bin/bash
#*************************************************************
#Author: pyy
#Date:  2020-06-20
#FileName:      menu.sh
#*************************************************************
#打印菜单
#------------水果菜单------------
#1.apple
#2.pear
#3.banana
#4.cherry
cat << EOF
------------水果菜单------------
1.apple
2.pear
3.banana
4.cherry
---------------------------------
EOF
read -p "请选择水果:" answer
case $answer in
	1) echo -e "\033[31m apple \033[0m" ;;
	2) echo -e "\033[32m pear \033[0m" ;;
	3) echo -e "\033[33m banana \033[0m" ;;
	4) echo -e "\033[35m cherry \033[0m" ;;
	*) echo "输入错误,无这类水果" 
	   exit 3
esac
[root@manager day4]# sh menu.sh
------------水果菜单------------
1.apple
2.pear
3.banana
4.cherry
---------------------------------
请选择水果:1
 apple 
[root@manager day4]# sh menu.sh
------------水果菜单------------
1.apple
2.pear
3.banana
4.cherry
---------------------------------
请选择水果:2
 pear

三、复合指令:一串命令

区别()和{}:
相同点:()和{}都是把一串的命令放在括号里面,如果命令在一行,则命令之间用;隔开
不同点:
()只是把一串命令重新开一个子shell进行执行,不影响当前shell环境;{}对一串命令在当前shell执行,影响当前shell环境
()最后一个命令不用分号,{}最后一个命令要用分号
()里的第一个命令和左边括号不必有空格,{}的第一个命令和左括号之间必要要有一个空格
()和{}中括号里面的某个命令的重定向只影响改名了,但括号外的重定向则影响到括号里的所有命令

#()在子shell中执行,不影响当前shell环境
[root@www day4]# (pwd;cd /tmp;pwd) 
/scripts/day4
/tmp
[root@www day4]# 
#{}在当前shell执行,影响当前shell环境,并且命令左边有空格,命令最后有分号
[root@www day4]# { pwd;cd /tmp;pwd;} 
/scripts/day4
/tmp
[root@www tmp]#

四、exit退出程序:exit语句的基本作用是终止Shell程序的执行。Shell程序的退出状态也储存在系统变量$?中。

语法如下:
exit 错误码 (取值范围为0~255,默认为0)

#使用tar命令时出错/
解决1:cd / && tar -czPf b a k d i r / e t c − bak_dir/etc- bakdir/etc(date +%F-%T).tar.gz /etc
解决2:加 -p 保留绝对路径,即允许备份数据中含有根目录 ‘/’。
tar -czPf b a k d i r / e t c − bak_dir/etc- bakdir/etc(date +%F-%T).tar.gz /etc【推荐】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着蜗牛追汤圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值