您的位置:首页 > 运维架构 > Shell

linux笔记之bash编程(二)

2014-12-04 20:48 274 查看
bash脚本编程之选择执行

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

2、条件测试的格式有哪几类?
[b]答:条件测试的格式:(1)test 条件表达式[/b]
[b] (2)[ 条件表达式 ]
[/b]
[b] (3)[[ 条件表达式 ]]
[/b]
[b] (4)命令表达式
[/b]



[b][b]3、条件表达式有哪几类?[/b][/b]
[b][b][b][b]答:条件表达式的的格式:[/b][/b][/b][/b]
[b][b][b][b] (1)整数测试:A,B
[/b][/b][/b][/b]
[b][b][b][b] A -gt B :A大于B为真
[/b][/b][/b][/b]
[b][b][b][b] A -ge B :A大于等于B为真
[/b][/b][/b][/b]
[b][b][b][b] A -qe B :A等于B为真
[/b][/b][/b][/b]
[b][b][b][b] A -lt B :A小于B为真[/b][/b][/b][/b]
[b][b][b][b] A -le B :A小于等于B为真[/b][/b][/b][/b]
[b][b][b][b] A -ne B :A不等于B为真[/b][/b][/b][/b]
[b][b][b][b] (2)字符串测试:A,B
[/b][/b][/b][/b]
[b][b][b][b] A > B :字符A大于B为真
[/b][/b][/b][/b]
[b][b][b][b] A < B :字符A小于B为真[/b][/b][/b][/b]
[b][b][b][b] A >= B :字符A大于等于B为真[/b][/b][/b][/b]
[b][b][b][b] A <= B :字符A小于等于B为真[/b][/b][/b][/b]
[b][b][b][b] A = B 或 A == B :字符A和字符B一样为真[/b][/b][/b][/b]
[b][b][b][b] A != B :A和B不一样为真[/b][/b][/b][/b]
[b][b][b][b] -z A :判断A是否为空;空则为真,不空则假[/b][/b][/b][/b]
[b][b][b][b] -n A :判断A为不空;不空则为真,空则为假
[/b][/b][/b][/b]
[b][b][b][b] (3)文件测试:$file[/b][/b][/b][/b]
[b][b][b][b]-e $file :文件是否存在;存在则为真[/b][/b][/b][/b]
[b][b][b][b] -f $file :普通文件是否存在;存在则为真[/b][/b][/b][/b]
[b][b][b][b] -d $file :是否存在且为目录[/b][/b][/b][/b]
[b][b][b][b] -h $file :是否存在且为符号链接文件[/b][/b][/b][/b]
[b][b][b][b] -b $file :是否存在且为块设备文件[/b][/b][/b][/b]
[b][b][b][b] -c $file :是否存在且为字符设备文件[/b][/b][/b][/b]
[b][b][b][b] -S $file :是否存在且为套接字文件[/b][/b][/b][/b]
[b][b][b][b] -p $file :是否存在且为管道文件[/b][/b][/b][/b]
[b][b][/b][/b]
[b][b][b][b] -r $file :当前用户对此文件是否拥有读权限[/b][/b][/b][/b]
[b][b][b][b] -w $file :当前用户对此文件是否拥有写权限[/b][/b][/b][/b]
[b][b][b][b] -x $file :当前用户对此文件是否拥有执行权限[/b][/b][/b][/b]
[b][b][/b][/b]
[b][b][b][b] -u $file :文件是否拥有suid权限[/b][/b][/b][/b]
[b][b][b][b] -g $file :文件是否拥有sgid权限[/b][/b][/b][/b]
[b][b][b][b] -k $file :文件是否拥有sticky权限[/b][/b][/b][/b]
[b][b][/b][/b]
[b][b][b][b] -O $file :当前用户是否为文件的属主[/b][/b][/b][/b]
[b][b][/b][/b][b][b][b][b] -G $file :当前用户是否为文件的属组[/b][/b][/b][/b]
[b][b][/b][/b]
[b][b][b][b] -N $file :文件自从上一次被读取之后,是否被修改过[/b][/b][/b][/b]
[b][b][/b][/b][b][b][b][b] $f1 -nt $f2 :文件f1是否比文件f2新[/b][/b][/b][/b]
[b][b][b][b] $f1 -ot $f2 :文件f1是否比文件f2旧[/b][/b][/b][/b]
[b][b][b][b] $f1 -ef $f2 :f1和f2是否为同一文件的硬链接[/b][/b][/b][/b]
[b][b][/b][/b]
[b][b][/b][/b]

[b][b][b][b][b][b][b]4、bash的选择执行是什么结构,有几种结构?[/b][/b] [/b][/b][/b][/b][/b][b][b][/b][/b][b][b][b][b]答:bash的选择执行是由if/then结构的,总共分为三种格式:单分支if/then、双分支if/then、多分支if/then[/b][/b][/b][/b]
单分支if/then结构格式:
if 条件表达式;then 执行体fi[b][b][b][b][b]结构解析:当条件表达式为真时,就运行执行体。[/b][/b][/b][/b][/b][b][b][b][b][b]实例:判断root用户是否登录,登录则打印一条信息(root login)否则不做任何处理。
[/b][/b][/b][/b][/b][b][b][b][b][b]vim who.sh[/b][/b][/b][/b][/b]
#!/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
[b][b][b][/b][/b][/b]

[b][b][b][/b][/b][/b]
双分支if/then结构格式:if 条件表达式;then 执行体1else 执行体2
fi[b][b][b][b][b][b]结构解析:当条件表达式为真时,就运行执行体1,否则运行执行体2。[/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b][b][b][b][b]实例:判断root用户是否登录,登录则打印一条信息(root login),否则打印另一条信息(root not login)[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b]vim who.sh[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
#!/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 执行体1elif 条件表达式2;then 执行体2
elif 条件表达式3;then 执行体3
............else 执行体n
fi[b][b][b][b][b][b][b][b][b][b][b][b][b]实例:判断一个用户是什么用户,0是root用户,1-499是系统用户500-5999为普通用户,6000以上为guest用户。[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
#!/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
[b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b]5、命令可以用作条件表达式吗?,有哪几种形式?[/b][/b][/b][/b][/b][/b][/b][b][b][b][b]答:命令可以用作条件表达式:(1)使用命令执行结果;使用命令引用,使用比较操作符。[/b][/b][/b][/b][b][b][b][b] (2)使用命令的退出状态码:先运行命令,退出状态码;引用方式有两种:[/b][/b][/b][/b](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
[b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b]
[b][b][b][b][b][b][b][b]6、组合条件表达式是给条件添加逻辑操作符[/b][/b][/b][/b][/b][/b][/b][/b]
[b][b][b][b][b][b][b][b][b][b][b][b][b]答:组合条件:[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]或 (-o) [ 条件表达式1 -o 条件表达式2 ][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]与 (-a) [ 条件表达式1 -a 条件表达式2 ][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]非 [ -! 添加表达式 ][b][b][b][b][b][b][b][b][b][b][b][b][b]实例:判断用户输入一个文件存在,且文件大小是10M,满足条件就输出信息(“file is 10M”)[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
#!/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
[b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
[b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b]7、组合条件表达式:短路操作符[/b][/b][/b][/b][/b][/b][/b][/b]
答:组合条件:或 :命令1 || 命令2 例如:[ -d $dir ] || mkdir $dir 格式解析:命令1的退出状态如果为真,则命令2不用运行,即可有最终结果。 与 :命令1 && 命令2 例如:[ ! -d $dir ] && mkdir $dir 格式解析:命令1的退出状态为假,则命令2不用运行,即可有最终结果。
非 :[ -! 添加表达式 ] 例如:[b][ ! -d $dir ][/b]



[b][b][b][b][b][b][b][b]8、case语句:是简化版的多分支语句,格式如下:[/b][/b][/b][/b][/b][/b][/b][/b]
case 变量引用 in

匹配表达式1)
分支1
;;
匹配表达式2)
分支2
;;
.....
*)
分支n
;;
esac
[b][b][b][b][b][b][b][b][b][b][b][b][b][b][b]结构解析:匹配表达式可使用通配符:* 表示任意长度的任意字符、?表示任意单个字符、[]表示指定范围内的任意单个字符、a|b表示a或b。[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][b][b][b][b][b][b][b][b][b][b][b][b][b][b][b]实例:编写一个脚本如果用户输入ifconfig就显示主机ip信息,如果用户输入hostname,就显示主机名,如果输入其它,就输出(input err)。[/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
[b][b][b][b][b][b][b][b][b][b][b][b][b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b][/b]
#!/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编程(三)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: