一、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【推荐】