shell流程控制
流程控制是改变程序运行顺序的指令。linux shell有一套自己的流程控制语句,其中包括条件语句(if),循环语句(for,while),选择语句(case)。下面我将通过例子介绍下,各个语句使用方法。
新知识点:
黑洞文件,此文件相当于windows的回收站,不会占我们的磁盘,为什么要导入,这样就会省略过程。
/dev/dull
提示你输入一个东西
read -p
间隔几秒显示
sleep 数字
对输出的结果不显示新行
echo -n
意思是初始值为0,一般结合let ++使用。
sum=0
读取每行的内容
read line
if语句(条件语句)
格式一:
#!/bin/bash if [ 条件表达式 ];then 命令(切记用tab键自动缩进一下,后期好排错) fi
格式二:
#!/bin/bash if [ 条件表达式 ] then 命令(切记用tab键自动缩进一下,后期好排错) fi
就是说你的条件表达式满足之后,你想干一些什么事情。
if分为单分支,双分支,多分支三种样式
单分支
if 条件表达式;then 命令(按tab键自动缩进一下) fi
举例:如果你输入的参数是1,那么显示的结果是“您输入的数字是1”(运用到的知识点,shell的特殊变量)
#!/bin/bash
if [ $1 -eq 1 ];then
echo "您输入的数字是$1"
fi
双分支(当条件表达式里的命令执行不成功时,就会执行else)
if 条件表达式;then 命令(按tab键自动缩进一下) else 命令(按tab键自动缩进一下) fi
举例:如果输入不是1的其他数字,显示的结果就是“您输入的数字不是1”
if [ $1 -eq 1 ];then echo "您输入的数字是: $1" else echo "您输入的数字不是1" fi
双分支运用实例
利用双分支检测一下crond是否开启
#!/bin/bash
soft=crond
status_crond=`ps aux | grep "crond" | grep -v "grep" | wc -l`
if [ $status_crond -eq 1 ];then
echo "$soft 正在运行!" else
echo "$soft 未运行" fi
利用双分支检查主机是否在线(黑洞文件,/dev/dull,此文件相当于windows的回收站,不会占我们的磁盘,为什么要导入,这样就会省略过程,只显示echo的输出结果,给用户一个好的体验。)
#/bin/bash
ip=192.168.1.9
ping -c 1 -w $ip &> /dev/null
if [ $? -eq 0 ];then
echo "$ip在线"
else
echo "$ip不在线" fi
多分支
if 条件表达式;then 命令(按tab键自动缩进一下) elif 条件表达式;then 命令(按tab键自动缩进一下) else 命令(按tab键自动缩进一下) fi
read –p:提示你输入一个东西
#!/bin/bash read -p "请输入一个数字: "num if [ $num -le 5 ];then echo "您输入的$num小于等于5" elif [ $num -gt 5 -a $num -le 10 ];then echo "您输入的$num大于5小于等于10" elif [ $num -gt 10 -a $num -le 20 ];then echo "您输入的$num大于10小于等于20" elif [ $num -gt 20 -a $num -le 30 ];then echo "您输入的$num大于20小于等于30" elif [ $num -gt 30 -a $num -le 40 ];then echo "您输入的$num大于30小于等于40" else echo "您输入的数字大于40!" fi
多分支运用实例
利用多分支编写一个简单的计算器
#!/bin/bash read -p "请输入第一个数字: "num1 read -p "请输入运算符号: "num2 read -p "请输入第二个数字: "num3 if [ -n "$num1" -a -n "$num2" -a -n "$num3" ];then if [ "$num2" == "+" ];then echo "${num1}${num2}${num3}=$((num1+num3))" elif [ "$num2" == "-"];then echo "${num1}${num2}${num3}=$((num1-num3))" elif [ "$num2" == "*"];then echo "${num1}${num2}${num3}=$((num1*num3))" elif [ "$num2" == "/"];then echo "${num1}${num2}${num3}=$((num1/num3))" else echo "请输入+-*/" fi else echo "请输入数字或运算符" fi
利用多分支检查用户是否存在
#!/bin/bash
read -p "请输入一个用户: "user
if id $user &> /dev/null;then
echo "$user存在"
else
echo "$user不存在!"
fi
for语句(循环语句,主要用于批量管理、检测)
书写格式:
第一种书写格式:
for 变量名 in 取值列表; do 命令 done
第二种书写格式:
for 变量名 in 取值列表 do 命令(切记首行缩进,tab键) done
输出一个1至9的数列,每2秒输出一行
#!/bin/bash
for i in `seq 9`
do
echo "$i"
sleep 2
done
运用实例
批量检测主机是否在线,在这里,ip是一个变量,i也是一个变量,两者的结合,就组成了IP。
#!/bin/bash ip=192.168.1. for i in {1..255} do if ping -c 1 -w 1 $ip$i &> /dev/null;then echo "$ip$i在线" else echo "$ip$i不在线" fi done
工作中的检测IP是否在线
#!/bin/bash ./etc/init.d/functions ip=192.168.1. for i in {1..255} do if ping -c 1 -w 1 $ip$i &> /dev/null;then echo -n"$ip$i" success echo "" else echo -n"$ip$i" failure echo "" fi done
求1到100的奇数和是多少(运用到前面学习的let ++)
#!/bin/bash sum=0 for i in `seq 1 2 100` do let sum+=$i done echo $sum
while循环语句(一般做的是死循环,条件为假就退出循环)
书写格式:
while 条件表达式; do 命令 done
这个是说只会循环1至5一次,当let++的值大于5时,就停止循环。
#!/bin/bash sum=0 while [ $sum -lt 5 ] do let sum++ echo $sum done
死循环,就是条件永为真
第一种永为真的方式:
#!/bin/bash sum=0 while true do let sum++ echo $sum sleep 2 done
第二种永为真的方式:
#!/bin/bash sum=0 while [1 -eq 1] do let sum++ echo $sum done
while运用实例
检测在线终端数量,这种虽然占用终端,但是把输出的内容写入到了/root/ter这个文件之中。
#!/bin/bash while true do num=`who | wc -l` echo "当前终端数量为$num" >> /root/ter sleep 5 done
#!/bin/bash while true do num=`who | wc -l` if [ $num -eq 5 ];then mail -s "当前在线终端数量达到预警值" exit fi done
如何把一个文本一行一行的读取出来
#!/bin/bash cat /etc/passwd | while read line do echo $line sleep 2 done
#!/bin/bash while read line do echo $line sleep 2 done < /etc/passwd
如何在不占用终端的情况下还在持续检测,方法有两种。
一:bash 脚本名称 & 而后再开一个终端tail –f 监测输出到文本即可。但是关掉运行此命令的终端,监测就会停止。
二:nohup bash 脚本名称 & 这样既不会占用当前终端,关掉当前运行此命令的终端也不会打断监测。
nohup意为挂起,他会生成一个nohup.out文件。
break(终止循环,停止当前的循环)和continue(跳出本次循环,就是你设置之后,不显示你设置的内容,之后进入死循环)语句
意思就是只输出1至4,到5的时候,就停止循环。
#!/bin/bash sum=0 while true do let sum++ if [ $sum -eq 5 ];then break fi echo $sum done
意思就是只显示1至10,但不显示5,当let ++的值大于10时,就停止此循环。
#!/bin/bash sum=0 while true do let sum++ if [ $sum -eq 5 ];then continue elif [ $sum -gt 10 ];then break fi echo $sum done
#!/bin/bash sum=0 while true do let sum++ if [ $sum -eq 5 ];then continue elif [ $sum -gt 10 ];then exit fi echo $sum done
case语句(用于centos6系统书写程序启动脚本)
书写格式:
case 模式名 in 模式 1) 命令 ;; 模式 2) 命令 ;; *) 不符合以上模式执行的命令 esac
#!/bin/bash function start { if [ -e /pid ];then echo "httpd is running" else /usr/local/httpd/bin/apachectl start fi } function stop { if [ -e /pid ];then /usr/local/httpd/bin/apachectl stop fi } function restart { if [ -e /pid ];then /usr/local/httpd/bin/apachectl stop /usr/local/httpd/bin/apachectl start else /usr/local/httpd/bin/apachectl start fi } case $1 in
case $1 in start) start ;; stop) stop ;; restart) reatrart ;; status) systemctl status httpd &> /dev/null echo "httpd status" ;; *) echo "Usage: $0 start|stop|restart|status" esac
练习
打印九九乘法口诀表
#!/bin/bash for i in `seq 9` do for a in `seq 9` do if [ $a -lt $i ];then echo -n "$a*$i=$((a*i))" fi done echo "" done
持续监测内存剩余量
#!/bin/bash while true do free=$(free -h | grep "Men" | cut -d "M" -f 4 | tr -d " ") if [ free -lt 500];then mail -s "当前内存剩余低于预警值" fi done