Linux笔记15-条件判断和流程控制

目录

条件判断

1、按照文件类型进行判断

2、按照文件权限进行判断

3、两个文件之间进行比较

4、两个整数之间比较

5、字符串的判断

6、多重条件判断

if语句

case语句

for循环

while循环

until循环


条件判断

1、按照文件类型进行判断

 两种判断格式

[root@localhost ~]# test -e /root/install.log

使用test 命令判断一个文件是否存在,运行后没有输出,使用 echo $? 查看上一条命令是否执行正确,正确输出0,错误输出1.

[root@localhost ~]# [ -e /root/install.log ]

注意下面红色部分一定要有空格。

[ -d /root ] && echo "yes" || echo "no" #第一个判断命令如果正确执行,则打印“yes”,否则打印“no”

判断 /root 是否是一个目录,如果是,打印yes,如果不是,打印no

2、按照文件权限进行判断

[ -w student.txt ] && echo "yes" || echo "no" #判断文件是拥有写权限的

注意:这样判断其实不是很标准,因为只要这个文件的所有者、所属组、其他人之中有一个拥有写权限,都会输出为yes。

3、两个文件之间进行比较

ln /root/student.txt /tmp/stu.txt #创建个硬链接吧

使用ll 看不出来哪个是硬连接哪个是原文件:

之前说过,如果要区分可以使用 i 节点查看: ll -i

但是,这也只是用眼睛去看。如果在shell中要判断,就要使用如下方法:

[ /root/student.txt -ef /tmp/stu.txt ] && echo "yes" || echo "no"

yes #用test测试下,果然很有用

4、两个整数之间比较

[ 23 -ge 22 ] && echo "yes" || echo "no"

yes #判断23是否大于等于22,当然是了

[ 23 -le 22 ] && echo "yes" || echo "no"

no #判断23是否小于等于22,当然不是了

5、字符串的判断

name=sc #给name变量赋值

[ -z "$name" ] && echo "yes" || echo "no"

no #判断name变量是否为空,因为不为空,所以返回no

aa=11

bb=22

#给变量aa和变量bb赋值

[ "$aa" == "$bb" ] && echo "yes" || echo "no"

no #判断两个变量的值是否相等,明显不相等,所以返回no

6、多重条件判断

aa=11

[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"

no

#判断变量aa是否有值,同时判断变量aa的是否大于23

#因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假

aa=24

[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"

yes

if语句

1、单分支if条件语句

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

或者

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

◆ 单分支条件语句需要注意几个点

◇ if语句使用fi结尾,和一般语言使用大括号结尾不同

◇ [ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格

◇ then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了

◆ 例子:判断分区使用率

#!/bin/bash
#统计根分区使用率
# Author: renxing (E-mail: xxx@abc.com)
rate=$(df  -h  |  grep  "/dev/sda3"  |  awk  '{print  $5}'  |  cut  -d  "%"  -f1)
#把根分区使用率作为变量值赋予变量rate
if [ $rate -ge 80 ]
	then
		echo "Warning! /dev/sda3 is full!!"
fi

2、双分支if条件语句

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

◆ 例子1:备份mysql数据库

#!/bin/bash

#备份mysql数据库。

# Author: renxing (E-mail: xxx@abc.com)

ntpdate asia.pool.ntp.org &>/dev/null
#同步系统时间
date=$(date +%y%m%d)
#把当前系统时间按照“年月日”格式赋予变量date
size=$(du -sh /var/lib/mysql)
#统计mysql数据库的大小,并把大小赋予size变量
if [ -d /tmp/dbbak ]
	then
		echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
		echo "Data size : $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 "Data size : $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

【案例中提到的几个经典的命令】

* date 命令:当前系统时间;

* ntpdate asia.pool.ntp.org : 同步网络上的时间到当前系统;

* date +%y%m%d:把当前系统时间按照“年月日”格式显示;

* du -sh /var/lib/mysql:查看目录的大小:

* echo “str...” > file.txt 和 echo “some_word...” >> file.txt 分别表示覆盖写入和追加写入文件:

* nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}' :使用nmap命令扫描服务器,并截取apache服务的状态

* ps aux | grep mysql :检测MySQL服务是否在运行

◆ 例子2:判断apache是否启动

#!/bin/bash

# Author: renxing (E-mail: xxx@abc.com)

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 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

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

# Author: renxing (E-mail: xxx@abc.com)

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语句

◆ 多分支case条件语句

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

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

◆ 例子

#!/bin/bash

#判断用户输入

# Author: renxing (E-mail: xxx@abc.com)

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

◆ 例子1

#!/bin/bash
#打印时间
# Author: renxing (E-mail: xxx@abc.com)

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

◆ 例子2

#!/bin/bash
#批量解压缩脚本
# Author: renxing (E-mail: xxx@abc.com)

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 

【扩展】命令 > 文件,会将这个命令的执行结果覆盖写入对应的文件(好神奇!)

一般来讲, for in A B C D ... 这样的方式,在批量处理文件中非常实用!

如下案例,将目录中的所有以 sh 结尾的文件循环处理,给文件重命名,添加前缀——牛逼!

◆ 语法二

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

◆ 例子3

#!/bin/bash
#从1加到100
# Author: renxing (E-mail: xxx@abc.com)

s=0
for (( i=1;i<=100;i=i+1 ))
        do
                s=$(( $s+$i )) 
        done
echo "The sum of 1+2+...+100 is : $s"

◆ 例子4

#!/bin/bash

#批量添加指定数量的用户

# Author: renxing (E-mail: xxx@abc.com)

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

◆ 总结:若不确定循环的次数,则使用第一种循环;若知道次数使用第二种。

while循环

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

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

◆ 例子

#!/bin/bash

#从1加到100

# Author: renxing (E-mail: xxx@abc.com)

i=1
s=0
while [ $i -le 100 ]
#如果变量i的值小于等于100,则执行循环
	do
		s=$(( $s+$i ))
		i=$(( $i+1 ))
	done
echo "The sum is: $s"

until循环

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

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

◆ 例子

#!/bin/bash

#从1加到100

# Author: renxing (E-mail: xxx@abc.com)
i=1
s=0
until [ $i -gt 100 ]
#循环直到变量i的值大于100,就停止循环
	do
		s=$(( $s+$i ))
		i=$(( $i+1 ))
	done
echo "The sum is: $s"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮尘笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值