学习笔记4——Shell编程(流程控制)

学习笔记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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值