bash编程之 条件判断

条件测试

[ EXPRESSION ]

[[ EXPRESSION ]]  如果使用[]出现语法错误,请立即改为[[]]

COMMAND

测试表达式:

(1) 整数测试; 

(2) 字符串测试;

(3) 文件测试

整数测试:A, B

A -gt B: 大于

A -ge B: 大于等于

A -eq B: 等于

A -lt B: 小于

A -le B: 小于等于

A -ne B: 不等于

 

注意: 整数和小数之间不能用上述命令比较大小,要引入bc命令,如

#!/bin/bash
#
outcount=`cat /proc/net/dev | grep eth1 | gawk '{print $10}'`
outcheck=`echo "$outcount > 500*1024*1024" | bc`
if [ $outcheck -eq 1 ];then
        echo "OutPut on eth1 is greator than 500M." | mail -s "Network Waring"  *@qq.com
fi

 

字符串测试:A, B

A > B

A < B

A >= B

A <= B

A == B或A = B:等值比较

A != B: 不等于

-z A: 判断A是否为空;空则为真,不空则假;

-n A:判断A是否不空;不空则为值,空则为假;

 注意: 判断符号两侧一定要有空格,否则会将整体当成字符串处理,返回真

COMMAND用作条件

(1) 使用命令执行结果;

(a) 使用命令引用

(b) 使用比较操作符

例如:[ `id -u $username` -lt 500 ]

userid=`id -u $username`

[ $userid -lt 500 ]

 

(2) 使用命令的退出状态码

(a) 先运行命令;

(b) 退出状态码

 

引用方式两种:

(a) if COMMAND; then

注意:COMMAND不能被命令引用;COMMAND的执行结果通常没有意义,所以其结果通常(&>)被定向至/dev/null

(b) 先执行命令,后判断退出状态码是否为0

COMMAND

if [ $? -eq 0 ]

文件测试:$file

-e $file: 是否存在;存在则为真;   [ -e  /tmp/aaa ]

-s $file: 如果文件存在且文件大小大于零,则返回真 

-a $file: 同上;弃用;

-f $file: 文件是否存在,且为普通文件;

-d $file: 是否存在且为目录;

-h $file: 是否存在且为符号链接文件;

-L $file:同上

-b $file: 是否存在且为块设备文件;

-c $file: 是否存在且为字符设备文件;

-S $file: 是否存在且为套接字文件:

-p $file: 是否存在且为管道文件;

-r $file: 当前用户对此文件是否拥有读权限;

-w $file:                         写

-x $file:                         执行权限;

-O $file: 当前用户是否为文件的属主;

-G $file: 当前用户是否属于文件的属组;

-N $file: 文件自从上一次被读取之后,是否被修改过;

$f1 -nt $f2: 文件f1是否比文件f2新;

$f1 -ot $f2: 文件f1是否比文件f2旧;

$f1 -ef $f2: f1和f2是否为同一个文件的硬链接;

 

练习:写一个脚本,传递一个文件路径参数给脚本

(1) 存在,则显示有此文件;

(2) 否则,则显示无此文件

 

练习:写一个脚本,传递一个文件路径参数给脚本

(1) 如果脚本无参数,则显示必须给至少一个参数,退出脚本;退出码5;

(2) 路径指向的文件如果不存在,则直接退出脚本;退出码为6;

(3) 判断文件类型:

(a) 如果是普通文件,则显示为"common file";

(b) 如果是目录,则显示为"directory";

(c) 如果是符号链接,则显示为"symbolic link file";

(d) 如果是块设备,则显示为“block device file";

(e) 如果是字符设备,则显示为"character device file";

(f) 否则,则显示为“unkown”;

		#!/bin/bash
		#
		if [ $# -lt 1 ]; then
			echo "At least one argument."
			exit 5
		fi
		if [ ! -e $1 ]; then
			echo "No such file."
			exit 6
		fi
		if [ -f $1 ]; then
			echo "common file."
		elif [ -d $1 ]; then
			echo "directory."
		elif [ -L $1 ]; then
			echo "Symbolic link."
		elif [ -b $1 ]; then
			echo "block device."
		elif [ -c $1 ]; then
			echo "character device."
		else
			echo "unkown type."
		fi

练习:写一个脚本,其使用格式如下所示(其中所有的script.sh均为用户给定的脚本名称,其要跟随脚本名称变化):

script.sh {start|stop|restart|status}

(1) 调用时至少传递一个参数;否则,则显示帮助信息,并退出脚本;

(2) 如果参数为“start”, 则创建空文件/var/lock/subsys/script.sh,并显示“starting script.sh successfully.”;

(3) 如果参数为“stop”,则删除空文件/var/lock/subsys/script.sh,并显示“stopping script.sh successfully.”;

(4) 如果参数为“restart”,则删除空文件/var/lock/subsys/script.sh,并显示“stopping script.sh successfully.”;而后重新创建之,并显示“restarting script.sh successfully.”;

(5) 如果参数为“status”,则

(a) 如果文件/var/lock/subsys/script.sh文件存在,则显示“running”;

(b) 否则,则显示为"stopped"

(6) 其它任意参数,均显示帮助信息后退出;帮助信息格式为命令使用格式;

		#!/bin/bash
		#
		# chkconfig: 2345 95 5
		# description: test service script
		#
		prog=`basename $0`
		lockfile=/var/lock/subsys/$prog
		if [ $# -lt 1 ]; then
			echo "Usage: $prog {start|stop|restart|status}"
			exit 1
		fi
		if [ "$1" == 'start' ]; then
			if [ -e $lockfile ]; then
				echo "$prog is aleady running."
				exit 1
			else
				touch $lockfile
				echo "Starting $prog succefully."
			fi
		elif [ "$1" == 'stop' ]; then
			if [ -e $lockfile ]; then
				rm -f $lockfile
				echo "Stopping $prog succefully."
			else
				echo "$prog is not running."
				exit 1
			fi
		elif [ "$1" == 'restart' ]; then
			if [ -e $lockfile ]; then
				rm -f $lockfile
				echo "Stopping $prog succefully."
				touch $lockfile
				echo "Starting $prog succefully."
			else
				touch $lockfile
				echo "Starting $prog succefully."
			fi
		elif [ "$1" == 'status' ];then
			if [ -e $lockfile ];then
				echo "$prog is running."
			else	
				echo "$prog is stopped."
			fi
		else
			echo "Usage: $prog {start|restart|status|stop}"
			exit 1
		fi

组合测试条件:

给条件添加逻辑操作符;

或, -o: [ -z "$hostname" -o "$hostname" == 'localhost' ]

与, -a: [ $uid -gt 0 -a $uid -lt 500 ]

非:[ ! EXPRESSION ]

 

练习:写一个脚本,取得当前的主机名,判断

(1) 如果主机名为空或为"localhost",则将其命名为stuX.lianshu.com;

(2) 否则,则显示主机名即可;

			#!/bin/bash
			#
			hostname=`hostname`

			if [ "$hostname" == 'localhost' -o -z "$hostname" ]; then
				hostname stu100.lianshu.com
				#echo "stu100.lianshu.com" > /proc/sys/kernel/hostname
			else
				echo "The hostname is: $hostname."
			fi

练习2:写一个脚本,传递一个参数给脚本;此参数为用户名

(1) 如果用户不存在,则直接退出脚本;

(2) 如果用户存在,

id=0,则显示为“system admin”

0<id<500,则显示为“system user”

id>=500,则显示为“Common user.”

		#!/bin/bash
		#
		if ! id $1 &> /dev/null; then
			echo "No such user."
			exit 1
		fi

		uid=$(id -u $1)

		if [ $uid -eq 0 ]; then
			echo "Sys Admin."
		elif [ $uid -gt 0 -a $uid -lt 500 ];then
			echo "Sys User."
		else
			echo "Common User."
		fi

练习3:写一个脚本,传递一个参数给脚本;此参数为用户名

(1) 如果用户不存在,则直接退出脚本;

(2) 如果用户的id号大于等于500,且其shell为“以sh结尾的”类型,则显示“a user can log system.”;否则,显示用户无法登录;

			#!/bin/bash
			#
			if ! id $1 &> /dev/null; then
				echo "No such user."
				exit 1
			fi

			if [[ `id -u $1` -ge 500 ]] && [[ `grep "^$1\>" /etc/passwd | cut -d: -f7` =~ /bin/.*sh$ ]]; then
				echo "a user can log system."
			else
				echo "a user cannot log."
			fi

组合测试条件:短路操作符

与:COMMAND1 && COMMAND2

COMMAND1的退出状态如果为假,则COMMAND2不用运行,即可有最终结果;

或:COMMAND1 || COMMAND2

COMMAND1的退出状态如果为真,则COMMAND2不用运行,即可有最终结果;

非:! COMMAND

[ ! -d /tmp/test ] && mkdir /tmp/test^C

[ -d /tmp/test ] || mkdir /tmp/test

 

练习4:写一个脚本,完成如下任务:

(1) 如果httpd进程或nginx进程处于运行中,则显示“web server started.”,并显示其监听的端口;

(2) 否则显示“no web server.”;

if pidof httpd &> /dev/null && pidof nginx &> /dev/null; 

提示: ss -ntuap 显示当前运行的所有服务及其监听端口

  ss -ntuap  | grep httpd  显示内容中包含httpd的监听端口

(n: 不显示域名显示IP,t: 显示TCP,u: 显示UDP,a 显示所有状态服务,p显示端口)

交互式脚本

read [OPTIONS] [name ...]

-p "PROMPT"

-t #: 超时秒数

给变量以默认值:

[ -z "$VAR" ] && VAR=VALUE

 

练习1:显示如下菜单给用户

cpu) show cpu infomation;

mem) show memory infomation;

disk) show disk infomation;

*) quit

提示用户键入选项:

(1) cpu: 显示CPU相关的信息

(2) mem: 显示内存相关的信息

(3) disk: 列出磁盘设备

(4) 其它任何信息,即为退出脚本

		#!/bin/bash
		#
		cat << EOF
					cpu) show cpu infomation;
					mem) show memory infomation;
					disk) show disk infomation;
					*) quit
		=================================================================
		EOF
		read -p "Your  choice: " choice

		if [[ "$choice" == 'cpu' ]]; then
			lscpu
		elif [[ "$choice" == 'mem' ]]; then
			free -m
		elif [[ "$choice" == 'disk' ]]; then
			fdisk -l /dev/sd[a-z]
		else
			echo "quit"
			exit 0
		fi	

猜你喜欢

转载自oracle-api.iteye.com/blog/2365403