学习笔记4——Shell编程(流程控制)
if语句
1.单分支if条件语句
if [ 条件判断式 ] ; then
程序
fi
#或者
if [ 条件判断式 ]
then
程序
fi
单分支条件语句需要注意几个点
● if语句使用fi结尾,和一般语言使用大括号结尾不同
● [ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
● then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了
例:
#!/bin/bash
# 统计根分区使用率
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f 1)
# 把根分区使用率作为变量值赋予变量rate
if [ $rate -ge 80 ]
then
echo "Warning! /dev/sda3 is full!"
fi
2.双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
例1:备份mysql数据库
#!/bin/bash
#备份mysql数据库。
ntpdateasia.pool.ntp.org&>/dev/null
#同步系统时间
date=$(date+%y%m%d)
#把当前系统时间按照“年月日”格式赋予变量
datesize=$(du-sh/var/lib/mysql)
#统计mysql数据库的大小,并把大小赋予size变量
if [ -d/tmp/dbbak ]
then
echo"Date:$date!" > /tmp/dbbak/dbinfo.txt
echo"Datasize$size">>/tmp/dbbak/dbinfo.txt
cd/tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
else
mkdir /tmp/dbbak
echo"Date:date!">/tmp/dbbak/dbinfo.txt
echo"Datasize:size">>/tmp/dbbak/dbinfo.txt
cd/tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql
dbinfo.txt &> /dev/null
rm -rf /tmp/dbbak/dbinfo.txt
fi
例子2:判断apache是否启动
#!/bin/bash
port=$(nmap -sT 192.168.1.156 | grep tcp | grep http |awk'{print$2}')
#使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port
if [ "$port"=="open" ]
then
echo“$(date) httpd is ok!” >> /tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd restart &> /dev/null
echo"$(date)httpd reboot!!!" >> /tmp/autostart-err.log
fi
3.多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
……省略更多条件…
else
当所有条件都不成立时,最后执行此程序
fi
例:
#!/bin/bash
#判断用户输入的是什么文件
read-p"Please in put a filename:"file #接收键盘的输入,并赋予变量file
if [ -z "$file" ] #判断file变量是否为空
then
echo "Error,please input a filename"
exit 1
elif [ ! -e "$file" ] #判断file的值是否存在
then
echo "Your input is not a file!"
exit 2
elif [ -f "$file" ] #判断file的值是否为普通文件
then
echo "$file is a regulare file!"
elif [ -d "$file" ] #判断file的值是否为目录文件
then
echo "$file is a directory!"
else
echo"$file is another file!"
fi
case语句
多分支case条件语句
● case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。
case $ 变量名 in
" 值1")
如果变量的值等于值1,则执行程序1
; ;
" 值2")
如果变量的值等于值2,则执行程序2
; ;
…省略其他分支…
* )
如果变量的值都不是以上的值,则执行此程序
; ;
esac
例:
#!/bin/bash
#判断用户输入
read -p "Please choose yes/no:" -t 30 cho
case $cho in
"yes")
echo"Your choose is yes!"
;;
"no")
echo"Your choose is no!"
;;
*)
echo"Your choose is error!"
;;
esac
for循环
语法一(适合批量解压缩、批量添加用户等)
for 变量 in 值1 值2 值3
do
程序
done
例:
#!/bin/bash
for city in beijing nanjing shanghai
do
echo "this city is $city "
done
输出:
this city is beijing
this city is nanjing
this city is shanghai
语法二
for((初始值;循环控制条件;变量变化))
do
程序
done
例:
#!/bin/bash
#从1加到100
num=0
for((i=1;i<=100;i++))
do
num=$(($num+$i))
done
echo "this sum of 1+2+...+100 is: $num"
while循环与until循环
1.while循环
● while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了
while [ 条件判断式 ]
do
程序
done
例:
#!/bin/bash
#从1加到100
i=1
s=0
while [ $i -le 100 ] #如果变量i的值小于等于100,则执行循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"
2、 until循环
● until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。
until [ 条件判断式 ]
do
程序
done
例:
#!/bin/bash
#从1加到100
i=1
s=0
until [ $i -gt 100 ] #循环直到变量i的值大于100,就停止循环
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "The sum is: $s"