码迷,mamicode.com
首页 > 系统相关 > 详细

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

时间:2015-08-15 14:44:42      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

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"

 

 

 

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

标签:

原文地址:http://www.cnblogs.com/mengrennwpu/p/4676752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!