bash编程之 条件判断
来源:互联网 发布:上海跳跃网络 编辑:程序博客网 时间:2024/06/02 10:00
条件测试:
[ 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.comfi
字符串测试: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 ]; thenecho "At least one argument."exit 5fiif [ ! -e $1 ]; thenecho "No such file."exit 6fiif [ -f $1 ]; thenecho "common file."elif [ -d $1 ]; thenecho "directory."elif [ -L $1 ]; thenecho "Symbolic link."elif [ -b $1 ]; thenecho "block device."elif [ -c $1 ]; thenecho "character device."elseecho "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/$progif [ $# -lt 1 ]; thenecho "Usage: $prog {start|stop|restart|status}"exit 1fiif [ "$1" == 'start' ]; thenif [ -e $lockfile ]; thenecho "$prog is aleady running."exit 1elsetouch $lockfileecho "Starting $prog succefully."fielif [ "$1" == 'stop' ]; thenif [ -e $lockfile ]; thenrm -f $lockfileecho "Stopping $prog succefully."elseecho "$prog is not running."exit 1fielif [ "$1" == 'restart' ]; thenif [ -e $lockfile ]; thenrm -f $lockfileecho "Stopping $prog succefully."touch $lockfileecho "Starting $prog succefully."elsetouch $lockfileecho "Starting $prog succefully."fielif [ "$1" == 'status' ];thenif [ -e $lockfile ];thenecho "$prog is running."elseecho "$prog is stopped."fielseecho "Usage: $prog {start|restart|status|stop}"exit 1fi
组合测试条件:
给条件添加逻辑操作符;
或, -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" ]; thenhostname stu100.lianshu.com#echo "stu100.lianshu.com" > /proc/sys/kernel/hostnameelseecho "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; thenecho "No such user."exit 1fiuid=$(id -u $1)if [ $uid -eq 0 ]; thenecho "Sys Admin."elif [ $uid -gt 0 -a $uid -lt 500 ];thenecho "Sys User."elseecho "Common User."fi
练习3:写一个脚本,传递一个参数给脚本;此参数为用户名
(1) 如果用户不存在,则直接退出脚本;
(2) 如果用户的id号大于等于500,且其shell为“以sh结尾的”类型,则显示“a user can log system.”;否则,显示用户无法登录;
#!/bin/bash#if ! id $1 &> /dev/null; thenecho "No such user."exit 1fiif [[ `id -u $1` -ge 500 ]] && [[ `grep "^$1\>" /etc/passwd | cut -d: -f7` =~ /bin/.*sh$ ]]; thenecho "a user can log system."elseecho "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 << EOFcpu) show cpu infomation;mem) show memory infomation;disk) show disk infomation;*) quit=================================================================EOFread -p "Your choice: " choiceif [[ "$choice" == 'cpu' ]]; thenlscpuelif [[ "$choice" == 'mem' ]]; thenfree -melif [[ "$choice" == 'disk' ]]; thenfdisk -l /dev/sd[a-z]elseecho "quit"exit 0fi
- bash编程之 条件判断
- 【bash】bash脚本编程之条件判断
- bash语法之条件判断
- Linux学习之十三(bash脚本编程之条件判断)
- Linux学习之十四(bash脚本编程之三条件判断及算术运算)
- Bash条件判断
- Linux Bash条件判断
- Shell编程之判断条件
- shell编程之条件判断
- Shell编程之条件判断
- linux脚本编程之条件判断
- 【Linux】Shell编程之条件判断
- linux 下bash条件判断属性整理
- shell编程-条件判断
- Linux之shell编程之条件判断与流程控制
- shell文本过滤编程(三):awk之条件判断
- Shell编程之条件判断与流程控制
- 十二.shell编程之条件判断与流程控制
- bash编程之 shell基本语法
- Linux进程全解11——进程间通信(IPC)概述
- VM虚拟机中centos的网络配置的问题与解决
- bash编程之 If和Case语句
- 一个农村大男孩的IT梦
- bash编程之 条件判断
- Jupyter notebook can not load module
- mybatis中javaType与jdbcType对应关系
- bash编程之 小技巧
- structs学习
- bash编程之 数组
- vim 基础 文件 命令
- bash编程之 函数
- React context/contextTypes