shell脚本编程学习笔记8(XDL)——流程控制和循环
shell脚本编程学习笔记8——流程控制和循环
1,if语句
1,框架
1,单分支:
if [条件判断式] ;then
program
fi
if [条件判断式]
then
program
fi
注意:
if语句使用fi结尾,和一般语言使用大括 号结尾不同
[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格
then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了
双分支
if [condition]
then
program
else
program
fi
多分支
if [condition]
then
program
elif [condition]
then
program
......
else
program
fi
2,实例:
1,判断根分区使用率。根分区使用大于指定的值,则警告
[root@iZwz9h901rvv69020rk7fsZ sh]# more dfh.sh
#!/bin/bash
rate=$(df -h | grep '/dev/xvda1' | awk '{printf $5 }' | awk 'BEGIN{FS="%"}{printf $1}');
if [ $rate -gt 80 ]
then
echo "warning,the used is $rate"
fi
[root@iZwz9h901rvv69020rk7fsZ sh]#
2,判断apache是否启动成功
[root@iZwz9h901rvv69020rk7fsZ sh]# more apache.sh
#!/bin/bash
status=$(nmap -sT 127.0.0.1 | grep 'http' | grep 'tcp' | awk '{printf $2}')
if [ "$status" == "open" ]
then
echo "$(date) httpd is ok" >>/root/log/httpd.log
else
/etc/rc.d/init.d/httpd start &> /dev/null
echo "$(date) restart httpd" >> /root/log/httpd.log
fi
[root@iZwz9h901rvv69020rk7fsZ sh]#
3,备份数据库
[root@li1079-128 bash]# more backup_mysql.sh
#!/bin/bash
ntpdate asia.pool.ntp.org &>/dev/null
date=$(date)
size=$(du -sh /usr/local/mysql/)
if [ -d /tmp/dbbak ]
then
echo "Date:$date">>/tmp/dbbak/dbinfo.log
echo "Size:$size">>/tmp/dbbak/dbinfo.log
cd /tmp/dbbak/
tar -zcvf mysql-lib-$date.tar.gz /usr/local/mysql/ &>/dev/null
else
mkdir /tmp/dbbak
echo "Date:$date">>/tmp/dbbak/dbinfo.log
echo "Size:$size">>/tmp/dbbak/dbinfo.log
cd /tmp/dbbak/
tar -zcvf mysql-lib-$date.tar.gz /usr/local/mysql/ &>/dev/null
fi
[root@li1079-128 bash]#
4,判断去什么地方
[root@iZwz9h901rvv69020rk7fsZ sh]# more duo.sh
#!/bin/bash
read -p "if you to guangzhou,please1\n
if you go to shanghai,please2\n
if you go to shenzhen,please3:" where
if [ "$where" -eq 1 ]
then
echo "guangzhou"
elif [ "$where" -eq 2 ]
then
echo "shanghai"
else
echo "shenzhen"
fi
[root@iZwz9h901rvv69020rk7fsZ sh]#
2,case语句
case语句和if…elif…else语句一样都是多 分支条件语句,不过和if多分支条件语句
不同的是,case语句只能判断一种条件关 系,而if语句可以判断多种条件关系
case $var in
"val1")
program
;;
"val2")
program
;;
......
*)
program
;;
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
3,for循环
1,语法
for 变量 in 值1 值2 值3…
do
程序
done
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
2,实例
#!/bin/bash
#打印时间
for time in morning noon afternoon evening
do
echo "This time is $time!"
done
#!/bin/bash
#批量解压缩脚本
cd /lamp
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxf $i &>/dev/null
done
rm -rf /lamp/ls.log
#!/bin/bash
# 从 1 加到 100
s=0
for (( i=1;i<=100;i=i+1 ))
do
s=$(( $s+$i ))
done
echo "The sum of 1+2+...+100 is : $s"
#!/bin/bash
#批量添加指定数量的用户
read -p "Please input user name: " -t 30 name
read -p "Please input the number of users: " -t 30 num
read -p "Please input the password of users: " -t 30 pass
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/[0-9]//g')
if [ -z "$y" ]
then
for (( i=1;i<=$num;i=i+1 ))
do
/usr/sbin/useradd $name$i &>/dev/null
echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
done
fi
fi
4,while和until循环
--while
简介:
while循环是不定循环,也称作条件循环 。只要条件判断式成立,循环就会一直继续
直到条件判断式不成立,循环才会停 止。这就和for的固定循环不太一样了
语法:
while [ 条件判断式 ]
do
程序
done
--until
简介:
until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执 行循环程序。一旦循环条件成立,则终止循环。
语法:
until [ 条件判断式 ]
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"
#!/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"