您的位置:首页 > 运维架构 > Shell

Linux学习笔记(18) Shell编程之流程控制

2015-08-15 13:37 591 查看
1. if语句

(1) 单分支if条件语句

格式为:

# 注意条件判断式两端的空格
if [ 条件判断式 ];then
程序员
fi

或者

if[ 条件判断式 ]
then
程序
fi


例:判断分区使用率

#!/bin/bash

#获取根分区的使用率
rate=$(df -h | grep "/dev/sda5" | awk '{print $5}' | cut -d "%" -f 1)

if [ $rate -ge 10 ]
then
echo "/dev/sda5 is over 10%!!"
fi


  (2) 双分支if条件语句

  格式为:

if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi


例1:备份/etc目录(同样适用于实际情况中的mysql备份)

#!/bin/bash
#备份mysql数据库
#Author :

#同步系统时间
#ntpdate asia.pool.ntp.org &> /dev/null
#把当前系统时间按照"年月日"格式赋予变量date
date=$(date +%y%m%d)
#统计mysql数据库的大小,并将其赋予size变量
size=$(du -sh /etc)

if [ -d /tmp/dbbak ]
then
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Date size : $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf etc_$date.tar.gz /etc dbinfo.txt &> /dev/null
rm -rf /tmp/dbbak/dbinfo.txt
else
mkdir /tmp/dbbak
echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
echo "Date size : $size" >> /tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
tar -zcf etc_$date.tar.gz /etc dbinfo.txt &> /dev/null
rm -rf /tmp/dbbak/dbinfo.txt
fi


例2:判断apache是否启动

#!/bin/bash
#Author :

#使用nmap命令扫描服务器(-sT表示扫描指定服务器上开启的TCP端口),并截取apache服务的状态,赋予变量port
port=$(nmap -sT 192.168.1.155 | grep tcp | grep http | awk '{print $2}')

if [ "$port"=="open" ]
then
echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
/etc/rc.d/init.d/httpd start &> /dev/null
echo "$(date) restart httpd!!" >> /tmp/autostart-err.log
fi


(3) 多分支if条件语句

格式为:

if [ 条件判断式1 ]
then
当条件判断式1成立,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
...省略更多条件...
else
当所有条件都不成立时,最后执行此程序
fi


例:判断用户输入的是什么文件

#!/bin/bash

#接收键盘收入,并赋予变量file
read -p "Please input a filename: " 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" ]
then
echo "$file is a directory!"
else
echo "$file is an other file!"
fi


输出结果:

[root@localhost sh]# ./if4.sh
Please input a filename:
Your input is not a file!
[root@localhost sh]# echo $?
2

[root@localhost sh]# ./if4.sh
Please input a filename: /root
/root is a directory!


2. case语句

case语句和if...elif...fi语句一样都是多分支条件语句,不过case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case的格式为:

case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac


例:判断用户输入

[root@localhost sh]# vi case1.sh

#!/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


输出结果:

[root@localhost sh]# chmod 755 case1.sh
[root@localhost sh]# ./case1.sh
Please choose yes/no: yes
Your choose is yes!
[root@localhost sh]# ./case1.sh
Please choose yes/no: no
Your choose is no!
[root@localhost sh]# ./case1.sh
Please choose yes/no: ls
Your choose is error!


3. for循环

Linux中的for循环有多种语法格式:

格式1:
for 变量 in 值1 值2 值3
do
程序
done


例1:打印时间及输出结果

[root@localhost sh]# vi for1.sh
#!/bin/bash

for time in morning afternoon evening
do
echo "This time is $time"
done

[root@localhost sh]# chmod 755 for1.sh
[root@localhost sh]# ./for1.sh
This time is morning
This time is afternoon
This time is evening


例2:批量解压缩

[root@localhost sh]# vi for2.sh
#!/bin/bash

cd /tmp
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxf $i &> /dev/null
done

rm -rf /tmp/ls.lo


格式2:
for (( 初始值;循环控制;变量变化 ))
do
程序
done


例1:从1加到100,并显示输出结果

[root@localhost sh]# vi for3.sh
#!/bin/bash

s=0
for(( i=0;i<=100;i=i+1 ))
do
s=$(( $s + $i ))
done

echo "The sum of 1+2+..+100 is : $s"

[root@localhost sh]# chmod 755 for3.sh
[root@localhost sh]# ./for3.sh
The sum of 1+2+..+100 is : 5050


注:两种for的区别在于是否事先知道处理的个数,如果知道,执行第二种for语法,否则执行第一种语法。

例2:批量添加指定数量的用户

[root@localhost sh]# vim for4.sh
#!/bin/bash
#Author:

read -t 30 -p "Please input username:" name
read -t 30 -p "Please input the number of users:" num
read -t 30 -p "Please input the passed of users:" 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


执行结果:

[root@localhost sh]# cat /etc/passwd
......
user1:x:501:503::/home/user1:/bin/bash
user2:x:502:504::/home/user2:/bin/bash


4. while循环与until循环

(1) while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样,其格式为:

while [ 条件表达式 ]
do
程序
done


例1:从1加到100

[root@localhost sh]# vim while1.sh
#!/bin/bash
#Author:

s=0
i=1
while [ $i -le 100 ]
do
s=$(( $s + $i ))
i=$(( $i + 1 ))
done

echo "The sum is : $s"


(2) until循环和while循环相反。until循环只要条件判断式不成立则进行循环,并执行循环程序。一旦条件判断式成立,则循环终止,其格式为:

until [ 条件判断式 ]
do
程序
done


例:从1加到100

[root@localhost sh]# vim while1.sh
#!/bin/bash
#Author:

s=0
i=1
until [ $i -gt 100 ]
do
s=$(( $s + $i ))
i=$(( $i + 1 ))
done

echo "The sum is : $s"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: