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编程(三)