bash脚本编程之选择执行

1、什么是选择执行?

答:选择执行是通过条件测试来完成的,测试某条件满足就执行,条件不满足就不执行。





2、条件测试的格式有哪几类?

答:条件测试的格式:(1)test  条件表达式

                   (2)[ 条件表达式 ]

                   (3)[[ 条件表达式 ]]

                   (4)命令表达式




3、条件表达式有哪几类?

答:条件表达式的的格式:

    (1)整数测试:A,B

                  A  -gt   B      :A大于B为真

                  A  -ge   B      :A大于等于B为真

                  A  -qe   B      :A等于B为真

                  A  -lt   B      :A小于B为真

                  A  -le   B      :A小于等于B为真

                  A  -ne   B      :A不等于B为真

    (2)字符串测试:A,B

                  A   >    B      :字符A大于B为真

                  A   <    B      :字符A小于B为真

                  A   >=   B      :字符A大于等于B为真

                  A   <=   B      :字符A小于等于B为真

                  A = B 或 A == B :字符A和字符B一样为真

                  A   !=   B      :A和B不一样为真

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

                  -n    A         :判断A为不空;不空则为真,空则为假

     (3)文件测试:$file

        -e  $file  :文件是否存在;存在则为真

                -f  $file  :普通文件是否存在;存在则为真

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

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

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

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

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

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

        

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

                -w  $file  :当前用户对此文件是否拥有写权限

                -x  $file  :当前用户对此文件是否拥有执行权限

        

                -u  $file  :文件是否拥有suid权限

                -g  $file  :文件是否拥有sgid权限

                -k  $file  :文件是否拥有sticky权限

        

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

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

        

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

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

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

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




4、bash的选择执行是什么结构,有几种结构?   
答:bash的选择执行是由if/then结构的,总共分为三种格式:单分支if/then、双分支if/then、多分支if/then

单分支if/then结构格式:

if  条件表达式;then

    执行体   

fi

结构解析:当条件表达式为真时,就运行执行体。

实例:判断root用户是否登录,登录则打印一条信息(root login)否则不做任何处理。

vim who.sh


#!/bin/bash
#***************************************************************************
#                              The root login                              *
#                              zouhg 2014-12-3                             *
#***************************************************************************
#***************************************************************************
#                              main function code                          *
#***************************************************************************
declare username="root"
if who |grep "^$username" &> /dev/null ;then
echo "root login"
fi






双分支if/then结构格式:

if  条件表达式;then

    执行体1   

else

    执行体2

fi

结构解析:当条件表达式为真时,就运行执行体1,否则运行执行体2。

实例:判断root用户是否登录,登录则打印一条信息(root login),否则打印另一条信息(root not login)

vim who.sh

#!/bin/bash
#***************************************************************************
#                              The root login                              *
#                              zouhg 2014-12-3                             *
#***************************************************************************
#***************************************************************************
#                              main function code                          *
#***************************************************************************
declare username="root"
if who |grep "^$username" &>/dev/null ;then
	echo "root login"
else
	echo "root not login"
fi




多分支if/then结构格式:

if  条件表达式1;then

    执行体1   

elif 条件表达式2;then

    执行体2

elif 条件表达式3;then

    执行体3

............

else

    执行体n

fi

实例:判断一个用户是什么用户,0是root用户,1-499是系统用户500-5999为普通用户,6000以上为guest用户。

#!/bin/bash
#***************************************************************************
#                              The user  level                             *
#                              zouhg 2014-12-3                             *
#***************************************************************************
#***************************************************************************
#                              main function code                          *
#***************************************************************************
declare username=$1
if id $username &> /dev/null && [ $# -ne 0 ] ;then
	if [ `id -u $username` -ge 6000 ];then
		echo "$username is guest user"
	elif [ `id -u $username` -ge 500 ];then
		echo "$username is user"
	elif [ `id -u $username` -gt 0 ];then
		echo "$username is system user"
	else
		echo "$username id admin user"
	fi
else
	echo "$username not user"
fi




5、命令可以用作条件表达式吗?,有哪几种形式?

答:命令可以用作条件表达式:(1)使用命令执行结果;使用命令引用,使用比较操作符。

                          (2)使用命令的退出状态码:先运行命令,退出状态码;引用方式有两种:

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

(b) 先执行命令,后判断退出状态码是否为0,格式:命令    if[ $? -eq 0 ]

实例:查看一个用户是否存在.

vim userexit.sh

#!/bin/bash
#***************************************************************************
#                              The user exist                              *
#                              zouhg 2014-12-3                             *
#***************************************************************************
#***************************************************************************
#                              main function code                          *
#***************************************************************************
read  -p  "input username" username
if id $username &> /dev/null;then
        echo "$username is exist"
else
        echo "$username is not exit"
fi




6、组合条件表达式是给条件添加逻辑操作符

答:组合条件:或 (-o)  [ 条件表达式1 -o 条件表达式2 ]

             与 (-a)  [ 条件表达式1 -a 条件表达式2 ]

             非 [ -! 添加表达式 ]

实例:判断用户输入一个文件存在,且文件大小是10M,满足条件就输出信息(“file is 10M”)

#!/bin/bash
#***************************************************************************
#                              The file                                    *
#                              zouhg 2014-12-3                             *
#***************************************************************************
#***************************************************************************
#                              main function code                          *
#***************************************************************************
read -p "input filename" filename
if [ -f $filename -a `ls -lh $filename|cut -d' ' -f5` == "10M" ];then
        echo "file is 10M"
fi





7、组合条件表达式:短路操作符

答:组合条件:或 :命令1 || 命令2  例如:[ -d  $dir ] || mkdir $dir

                格式解析:命令1的退出状态如果为真,则命令2不用运行,即可有最终结果。

             与 :命令1 && 命令2  例如:[ ! -d $dir ] && mkdir $dir

                格式解析:命令1的退出状态为假,则命令2不用运行,即可有最终结果。

             非 :[ -! 添加表达式 ] 例如:[ ! -d $dir ]






8、case语句:是简化版的多分支语句,格式如下:


case  变量引用  in


匹配表达式1)

        分支1

        ;;

匹配表达式2)

        分支2

        ;;

.....

*)

        分支n

        ;;

esac

结构解析:匹配表达式可使用通配符:* 表示任意长度的任意字符、?表示任意单个字符、[]表示指定范围内的任意单个字符、a|b表示a或b。

实例:编写一个脚本如果用户输入ifconfig就显示主机ip信息,如果用户输入hostname,就显示主机名,如果输入其它,就输出(input err)。

#!/bin/bash
#***************************************************************************
#                              The host info                               *
#                              zouhg 2014-12-3                             *
#***************************************************************************
#***************************************************************************
#                              main function code                          *
#***************************************************************************
read -p "input ifconfig or hostname:" ifconfig
case $ifconfig in
ifconfig)
        ifconfig;;
hostname)
        hostname;;
*)
        echo "input err";;
esac

bash脚本编程的其他内容在:linux笔记之bash编程(三)