shell编程--四种流程控制语句

文章目录

  • 一、流程控制--if语句
    • 1、单分支if条件语句
    • 2、双分支if条件语句
    • 3、多分支if条件语句
  • 二、流程控制--case语句
    • 1、定义
    • 2、命令格式
  • 三、流程控制for循环
    • 1、语法一
    • 2、语法二
  • 四、流程控制while循环
    • 1、while循环
    • 2、until循环

一、流程控制–if语句

1、单分支if条件语句

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

或者

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

示例代码: 判断分区使用率

#!/bin/bash

rate=$(df -h |grep /dev/vda1 | awk '{print $5}' | cut -d "%" -f1)

if [ $rate -ge 80 ]
	then
		echo "Waning it is fulling"
fi

2、双分支if条件语句

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

示例1:备份脚本

#!/bin/bash
# 同步时间
ntpdate asia.pool.ntp.org &>/dev/null
date=$(date +%y%m%d)
size=$(du -sh /var/lib/jenkins)
if [ -d /var/lib/jenkins ]
	then
		echo "Date : $date" > /data/ylxtest/logs/jenkins_info.txt
		echo "Data size : $size" >> /data/ylxtest/logs/jenkins_info.txt
		cd /data/ylxtest/logs
		tar -zcf etc_$date.tar.gz /etc jenkins_info.txt &>/dev/null
		rm -rf /data/ylxtest/logs/jenkins_info.txt
	else
		mkdir -r /data/ylxtest/logs
                echo "Date : $date" > /data/ylxtest/logs/jenkins_info.txt
		echo "Data size : $size" >> /data/ylxtest/logs/jenkins_info.txt
		cd /data/ylxtest/logs
		tar -zcf etc_$date.tar.gz /etc jenkins_info.txt &>/dev/null
	      	rm -rf /data/ylxtest/jenkins_info.txt
fi

示例2:判断apache是否启动

#!/bin/bash
#使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port
port=$(nmap -sT 127.0.0.0 | grep tcp | grep http | awk '{print $2}')
if [ "$port" == "open" ]
	then
		echo "$(data) httpd start"  &>/dev/start.log
	else 
		/etc/rc.d/init.d/httpd start &> /dev/null
		echo "$(data) restart httpd"  &>> /dev/error.log
fi

3、多分支if条件语句

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

示例:判断键盘输入的内容

#!/bin/bash
read -p "Please input 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 an other file!"
fi

二、流程控制–case语句

1、定义

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

2、命令格式

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

示例:

#!/bin/bash

read -p "Please choose yes/no : " -t 30 cho
# 接收键盘的输入,并赋予变量cho,
case $cho in
	"yes")
		echo "Your choose is yes"
		;;
	"no")
		echo "Your choose is no"
                ;;
	*)
		echo "Your choose is error!"
		;;
esac

-t: 等待键盘输入的时间

三、流程控制for循环

1、语法一

for 变量 in 值1 值2 值3...
# 后面有几个值就循环几次
	do 
		程序
	done

示例1:

#!/bin/bash

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

示例2:批量解压缩脚本

cd /data/test
ls *.tar.gz > ls.log  # 把当前目录下tar.gz包名称写入到ls.log文件中
for i in $(cat ls.log)
	do
		tar -zxf $i>/dev/logs
	done
rm -rf /dev/logs

2、语法二

for ((初始值;循环控制条件;变量变化))
	do
		程序
	done

示例:1~100之和

#!/bin/bash

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

示例2:批量添加用户

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

if [ ! -z "$name" -a ! -z "$num" -a ! -z "$passwd" ]
# -a: 为真
	then
		y=$(echo $num | sed 's/[0-9]//g')
		if [ -z "$y" ]
			then
				for((i=1;i<=$num;i+=1))
					do
						useradd $name$i &>/data/ylxtest/useradd.log
						echo $passwd | passwd --stdin "$name$i" &>/data/ylxtest/useradd.log	
			done
		fi
fi

四、流程控制while循环

1、while循环

while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断不成立,循环才会停止。

示例:从1加到100

#!/bin/bash

s=0
i=1

while [ $i -le 100 ]
	do
		s=$(( $s+$i ))
		i=$(( $i+1 ))
	done
echo "The sum is : $s"

2、until循环

until循环和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行村换程序。一旦循环条件成立,则终止循环。

示例:从1加到100

#!/bin/bash
  
s=0
i=1

until [ $i -gt 100 ]
        do
                s=$(( $s+$i ))
                i=$(( $i+1 ))
        done
echo "The sum is : $s"

你可能感兴趣的:(Linux,shell,linux)