外贸网站 在线留言,遵义做网站建设哪家公司好,嘉兴网站制作费用,wordpress网站布置视频教程第四章 流程控制之条件判断 条件判断语句是一种最简单的流程控制语句。该语句使得程序根据不同的条件来执行不同的程序分支。本节将介绍Shell程序设计中的简单的条件判断语句。 if语句语法
单分支结构
# 语法1#xff1a;
if 条件表达式
then指令
fi
#语法2#x…第四章 流程控制之条件判断 条件判断语句是一种最简单的流程控制语句。该语句使得程序根据不同的条件来执行不同的程序分支。本节将介绍Shell程序设计中的简单的条件判断语句。 if语句语法
单分支结构
# 语法1
if 条件表达式
then指令
fi
#语法2
if 条件表达式;then指令
fi
双分支结构
if 条件表达式
then指令序列1
else指令序列2
fiif id username;thenecho
elseecho cunzai
fi
多分支结构
语法
if 条件表达式1;then命令序列1
elif 条件表达式2;then命令序列2
....
else命令序列n
fi
案例 例1编写脚本choice1.sh利用单分支结构实现输入2个整数输出最大值
[rootserver ~]# vim choice1.sh
#!/bin/bash
read -p 请输入第一个整数: x
read -p 请输入第二个整数: y
max$x
if (($maxy))
thenmax$y
fi
echo 最大值$max 例2面试题编写脚本choice2.sh判断系统内存剩余容量大小若低于100M则发送消息进行告警
#!/bin/bash
free_mem$( free -m | grep Mem | tr -s | cut -d -f4 )
if (($free_mem100))
thenecho 警告剩余内存$free_mem ,低于警戒线100MB
elseecho 剩余内存$free_mem,空间足够.
fi
# free -m 表示显示内存即虚拟内存的信息-m以MB单位显示数字
# grep Mem表示过滤包含Mem所在行
# tr -s 压缩空格为一个
# cut -d -f4 :以空格为间隔符取其第4部分 扩展编写脚本判断当前系统剩余内存大小如果低于100M邮件报警管理员使用计划任务每10分钟检查一次。 [rootlocaklhost ]# echo 邮件正文 | mail -s 邮件主题 alice
分析核心是如何获取当前剩余内存大小
[rootlocalhost ~]# free -m | grep Mem: |tr -s | cut -d -f4
600
[rootlocalhost ~]# free -m | awk /Mem:/ {print $4}
600
vim mem.sh
memfree -m |grep Mem | tr -s | cut -d “ ” -f 4
free -m | grep Mem | awk -F ‘{print }’
if test $mem \ 100 ;thenecho 内存严重不足 | mail -s 内存报警 lxx163.com
elseecho 内存足够
fi例3编写脚本choice3.sh判断当前脚本的执行者若不是root账户则提示并退出
# 检查当前账户的4种方法
[rootserver ~]# whoami
root#使用环境变量
[rootserver ~]# echo $USER
root
#id -u结果为零则为root
[rootserver ~]# id -u
0[rootserver ~]# echo $UID
0
[rootserver ~]# vim choice3.sh
#!/bin/bash
if [ $USER ! root ] #或者if [ $c_user root ];then
then echo please switch user root
fi
[rootserver ~]# bash choice3.sh # root账户下执行
[rootserver ~]# pwd
/root
[rootserver ~]# mv choice3.sh / # 让普通账户能访问脚本需要移动到/
[rootserver ~]# chmod x /choice3.sh # 赋予执行权限
[rootserver ~]# ll /choice3.sh
-rwxr-xr-x 1 root root 81 6月 18 10:10 /choice3.sh
[rootserver ~]# tail -1 /etc/passwd # 查看普通账户名
fox:x:1000:1000::/home/fox:/bin/bash
[rootserver ~]# su fox # 切换账户
[foxserver root]$ cd /
[foxserver /]$ bash choice3.sh
please switch user root 例4编写脚本choice4.sh实现闰年的判断
[rootserver ~]# vim choice4.sh
#!/bin/bash
read -p 请输入4位数整数年份: year
if [ -n $year ] # 非空测试
thenif ((year%40)) ((year%100!0)) || ((year%4000))thenecho 闰年elseecho 平年fi
elseecho 请输入有效4位整数年份
fi 例5判断数字大于500则执行big.sh 小于等于500则退出脚本并输出报错信息
read -p s数字 num
if [ $num -gt 500 ] ;thenbash /big.sh
elseexit 0
fi 例6编写脚本choice5.sh判断sshd是否运行
分析核心在于判断进程是否运行的方法
方法1查看进程 systemctl is-active sshd systemctl status sshd
[rootlocalhost ~]# ps -elf | grep sshd | grep -v grep | wc -l
4
方法2查看端口
本地查看netstat、ss、lsof --- https://www.jianshu.com/p/644e75af4405
远程查看telnet、nmap、nc
[rootlocalhost ~]# netstat -lnupt | grep 22 | wc -l
2
[rootlocalhost ~]# ss -lnupt | grep 22 | wc -l
2
[rootlocalhost ~]# lsof -i:22
[rootlocalhost ~]# nmap -p 22 127.0.0.1 | grep open | wc -l
1
# 分析
# 根据进程数判断
[rootserver ~]# ps -ef | grep sshd | grep -v grep | wc -l
# 根据端口号判断
[rootserver ~]# netstat -lntup | grep 22 | wc -l
[rootserver ~]# vim choice5.sh
#!/bin/bash
num$(ps -ef | grep sshd | grep -v grep | wc -l)
if (($num0))
thenecho sshd is running
elseecho sshd is not running
fi方法2
read -p 请输入要判断的程序名称 server_name
countps -aux | grep -cw $server_nameif [ $count -gt 1 ];thenecho $server_name服务已运行
elseecho $server_name服务未运行
fi 例7面试题编写脚本choice6.sh判断主机是否存活
[rootserver ~]# vim choice6.sh
#!/bin/bash
read -p 请输入测试主机的IP地址 ip
ping -c 2 -w 3 $ip /dev/null
# -c 2 表示发送2个数据包-w 3 表示等待3秒结束注意不能等待1秒结束有可能第二个数据包没有ping完就结束了会返回错误的状态码
if [ $? -eq 0 ]
thenecho 主机$ip 已运行
elseecho 主机$ip 未运行
fi
# 上例修改使用循环测试多台主机是否存活设置显示颜色
[rootserver ~]# vim choice6.sh
#!/bin/bash
for ip in 192.168.48.{125..135}
do
ping -c 2 -w 3 $ip /dev/nullif [ $? -eq 0 ]thenecho -e \e[1;31m!!主机 $ip 已运行!!\e[0m # 高亮、红色elseecho 主机$ip 未运行fi
done 例8编写脚本choice7.sh输入百分制成绩判断等级成绩
[rootserver ~]# vim choice7.sh
#!/bin/bash
read -p 请输入百分制成绩: score
if [ -z $score ]
thenecho 未输入请重新输入
elif [ $score -lt 0 -o $score -gt 100 ]
thenecho 成绩输入有误请输入0-100间数字
elif [ $score -ge 90 ]
thenecho 成绩优秀
elif [ $score -ge 80 ]
thenecho 成绩良好
elif [ $score -ge 60 ]
thenecho 成绩及格
elseecho 补考
fi
扩展根据用户输入成绩判断优良中差。85-100 优秀--A 70-84 良好--B 60-69 合格--C 60分以下不合格--D
read -p Please enter your score (0-100): gradeif [ $grade -ge 85 ]
thenecho $grade, A
elif [ $grade -ge 70 ]
thenecho $grade, B
elif [ $grade -ge 60 ]
thenecho $grade, C
elseecho $grade, D
fi更完善的多层嵌套
grade$1if [[ $1 ~ ^[0-9]*$ ]];then #判断是否是纯数值有小数也不行if [ $grade -ge 85 -a $grade -le 100 ];thenecho $grade, Aelif [ $grade -ge 70 -a $grade -le 84 ];thenecho $grade, Belif [ $grade -ge 60 -a $grade -le 69 ];thenecho $grade, Celif [ $grade -ge 0 -a $grade -le 60 ];thenecho $grade, Delseecho 输入的成绩不在0-100范围内fi
elseecho 请输入正确成绩
fi解释$1 ~ ^[0-9]*$
~正则符匹配
^[0-9]以0-9开头的任意一个
*匹配前一个字符任意次正则符
$结束符保证数值结束前后没有其他信息 例9编写脚本根据用户输入的内容判断是数字、字母、其它字符
[rootserver ~]# vim choice8.sh
#!/bin/bash
read -p 请输入数字、字母、符号: str
if echo $str | grep [a-zA-Z] /dev/null
thenecho 字母
elif echo $str | grep [0-9] /dev/null
thenecho 数字
elseecho 符号
fi 例10编写脚本choice9.sh判断当前主机cpu生产商 其信息在/proc/cpuinfo文件中vendor_id一行中。 如果其生产商为GenuineIntel就显示其为Intel公司 如果其生产商为AuthenticAMD就显示其为AMD公司 否则就显示无法识别 [rootserver ~]# vim choice9.sh
#!/bin/bash
vendor$(grep vendor_id /proc/cpuinfo | uniq | cut -d -f2)
if [ $vendor GenuineIntel ]
then echo Intel
elif [ $vendor AuthenticAMD ]
then echo AMD
else echo other
fi
例11两个整数比较大小if嵌套
read -p 请输入整数 a
read -p 在次输入 b
if [ -n $a -a -n $b ];then[[ $a ~ ^[0-9]$ ]] [[ $b ~ ^[0-9]$ ]]# echo $a|[ -n sed -n /^[0-9]*$/p ] echo $b |[-n sed -n /^[0-9]*$/p]if [ $? -eq 0 ];thenif [[ $a -gt $b ]];thenecho 第一个数大于第二个数elif [[ $a -lt $b ]];thenecho 第一个数小于第二个数elseecho 两个数相等fielseecho 请输入数字fi
elseecho 输入信息不能为空
fi exit退出程序 复习
exit语句的基本作用是终止Shell程序的执行。除此之外exit语句还可以带一个可选的参数用来指定程序退出时的状态码。exit语句的基本语法如下 exit status其中status参数表示退出状态该参数是一个整数值其取值范围为0~255。与其他的Shell命令的一样Shell程序的退出状态也储存在系统变量$?中因此用户可以通过该变量取得Shell程序返回给父进程的退出状态码。 case多条件判断 case可针对谋变量不同的值结果进行情景分析。 格式
case 变量名 in值1)指令1;;值2)指令2;;值3)指令3 ;;*默认
esac也可以写在一行例 值1) 指令1 ;;
最后一个;;可以写也可以不写
执行过程 case语句会将该变量的值与 )括号中的值相比较如果与某个值相等则执行对应语句。 当遇到“;;”符号时就跳出case语句执行esac语句后面的语句。 如果没有与任何一个值相匹配则执行*)后面的一组语句
示例 例1编写脚本choice10.sh对上例7的百分制成绩判断等级成绩进行改写
[rootserver ~]# vim choice10.sh
#!/bin/bashread -p 请输入百分制成绩: scorecase $score in9[0-9]|100)echo 成绩优秀;;8[0-9])echo 成绩良好;;6[0-9]|7[0-9])echo 成绩及格;;*)echo 补考
esac 例2判断今天是星期几根据星期几来判断今天是工作日还是休息日
[rootserver ~]# vim choice11.sh
#!/bin/bash
adate %w #将日期转换为星期几用数字0-6表示
case $a in
[1-5])echo 今天是工作日社畜没有休息日哦。;;
[06])echo 哦~今天是休息日呢请好好休息哦~;;
esac 例3由用户从键盘输入一个字符并判断该字符是否为字母、数字或者其他字符 并输出相应的提示信息
read -p Please enter a character, press enter to continue: -n 1 str
if echo $str|grep [a-zA-Z] /dev/null
thenecho Input is letter
elif echo $str|grep [0-9] /dev/null
thenecho Input is number
elseecho Input is other
firead -p Please enter a character, press enter to continue: -n 1 KEY
case $KEY in[[:alpha:]])echo Input is letter;;[0-9])echo Input is number;;*)echo Input is other characters
esac
例4将判断分数范围多分支语句用case语句实现
read -p Please enter your score (0-100): grade
case $grade in8[5-9]|9[0-9]|100) #{85..100} [85-100]echo $grade, A;;7[0-9]|8[0-4])echo $grade, B;;6[0-9])echo $grade, C;;*)echo $grade, D
esac 练习 开发rsync起停脚本
[rootserver ~]# vim cc_rsync
#!/bin/bash
if [ $# -ne 1 ]; thenecho Usage: $0 {start|stop|restart}exit 1
fi
# 当用户选择是start
case $1 instart)/usr/bin/rsync --daemonsleep 1if [ netstat -lntup | grep rsync | wc -l -ge 1 ]; thenecho rsync is startedexit 0fi;;stop)killall rsync /dev/nullsleep 1if [ netstat -lntup | grep rsync | wc -l -eq 0 ]; thenecho rsync is stoppedexit 0fi;;restart)if [ netstat -lntup | grep rsync | wc -l -ge 1 ]; thenkillall rsync /dev/nullsleep 1fi/usr/bin/rsync --daemonsleep 1start_flagnetstat -lntup | grep rsync | wc -l#if [ $stop_flag -eq 0 -a $start_flag -ge 1 ]; then#if [ $stop_flag -eq 0 $start_flag -ge 1 ]; thenif [ netstat -lntup | grep rsync | wc -l -ge 1 ]; thenecho rsync is restartedexit 0fi;;*)echo Usage: $0 {start|stop|restart}
esac 扩展远程端口监听 telnet nmap nc ncnetcat 是一个简单的 Unix 工具它使用 TCP 或 UDP 协议去读写网络连接间的数据。 nmap“Network Mapper”是一个用于网络探索和安全审计的开源工具被设计用来快速地扫描大规模网络。 telnet被用来交互地通过 TELNET 协议与另一台主机通信。
1nc 即 netcat。netcat 是一个简单的 Unix 工具它使用 TCP 或 UDP 协议去读写网络连接间的数据。
它被设计成为一个可信赖的后端工具可被直接使用或者简单地被其他程序或脚本调用。
与此同时它也是一个富含功能的网络调试和探索工具因为它可以创建你所需的几乎所有类型的连接并且还拥有几个内置的有趣功能。
netcat 有三类功能模式它们分别为连接模式、监听模式和隧道模式。
ncnetcat命令的一般语法
$ nc [-options] [HostName or IP] [PortNumber]
在下面的例子中我们将检查远程 Linux 系统中的 22 端口是否开启。
假如端口是开启的你将获得类似下面的输出。
# nc -zvw3 192.168.1.8 22
Connection to 192.168.1.8 22 port [tcp/ssh] succeeded!
命令详解 nc即执行的命令主体 z零 I/O 模式被用来扫描 v显式地输出 w3设置超时时间为 3 秒 192.168.1.8目标系统的 IP 地址 22需要验证的端口。
当检测到端口没有开启你将获得如下输出
# nc -zvw3 192.168.1.95 22
nc: connect to 192.168.1.95 port 22 (tcp) failed: Connection refused
2nmap“Network Mapper”是一个用于网络探索和安全审计的开源工具被设计用来快速地扫描大规模网络尽管对于单个主机它也同样能够正常工作。
nmap 以一种新颖的方式使用裸 IP 包来决定网络中的主机是否可达这些主机正提供什么服务应用名和版本号它们运行的操作系统系统的版本它们正在使用的是什么包过滤软件或者防火墙以及其他额外的特性。
尽管 nmap 通常被用于安全审计许多系统和网络管理员发现在一些日常任务例如罗列网络资产、管理服务升级的计划、监视主机或者服务是否正常运行中它也同样十分有用。
nmap 的一般语法
$ nmap [-options] [HostName or IP] [-p] [PortNumber]
假如端口是开启的你将获得如下的输出
# nmap 192.168.1.8 -p 22
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-16 03:37 IST Nmap scan report for 192.168.1.8 Host is up (0.00031s latency).
PORT STATE SERVICE
22/tcp open ssh
Nmap done: 1 IP address (1 host up) scanned in 13.06 seconds
假如端口没有开启你将得到类似下面的结果
# nmap 192.168.1.8 -p 80
Starting Nmap 7.70 ( https://nmap.org ) at 2019-03-16 04:30 IST
Nmap scan report for 192.168.1.8
Host is up (0.00036s latency).
PORT STATE SERVICE
80/tcp closed http
Nmap done: 1 IP address (1 host up) scanned in 13.07 seconds
3telnet 命令被用来交互地通过 TELNET 协议与另一台主机通信。
telnet 命令的一般语法
$ telnet [HostName or IP] 80
假如探测成功你将看到类似下面的输出
$ telnet 192.168.1.9 22
Trying 192.168.1.9...
Connected to 192.168.1.9.
Escape character is ^].
SSH-2.0-OpenSSH_5.3
^]
Connection closed by foreign host.
假如探测失败你将看到类似下面的输出
$ telnet 192.168.1.9 80
Trying 192.168.1.9...
telnet: Unable to connect to remote host: Connection refused
示例 2检查主机是否存活并输出结果 分析最简单方式是通过ping命令检测ping -c 2 -W 1 192.168.95.16 /dev/null通过$?判断也可以直接 if ping -c 2 -W 1 192.168.95.16 /dev/null测试 扩展 [rootbogon day04]# dnf whatprovides nmap #查询命令nmap所能提供的安装包