shell中的条件判断与控制流程
来源:互联网 发布:编程好看的字体 编辑:程序博客网 时间:2024/05/18 03:07
条件判断
1.按照文件类型进行判断
测试选项
作用
-b 文件
判断该文件是否存在,并且是否为块设备文件(是块设备文件则为真)
-c 文件
判断文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件
判断文件是否存在,并且是否为目录文件(是目录则为真)
-e 文件
判断文件是否存在(存在为真)
-f 文件
判断文件是否存在,并且是否为普通文件(是普通文件则为真)
-L 文件
判断文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件
判断文件是否存在,并且是否为管道文件(是管道文件则为真)
-s 文件
判断文件是否存在,并且是否为空(非空为真)
-S 文件
判断文件是否存在,且是否为套接字文件(是套接字文件为真)
判断式有两种格式(通常使用后一种):
test -e /etc/profile
[ -e /etc/profile ](中括号和条件判断式之间一定要有空格!)
例如,执行:
[ -e /etc/profile ] && echo yes || echo no
执行结果为 yes
2.按文件权限判断
测试选项
作用
-r 文件
文件存在且拥有读权限为真
-w 文件
文件存在且有写权限为真
-x 文件
文件存在且拥有执行权限为真
-u 文件
文件存在且拥有SUID权限为真
-g 文件
文件存在且拥有SGID权限为真
-k 文件
文件存在且拥有SBIT权限为真
例如执行:
[ -w /etc/profile ] && echo yes || echo no结果为yes
这里要注意:权限测试并不区分是哪一个用户的权限,只要存在一个用户有相应的权限即为真。
3.比较两个文件
测试选项
作用
文件1 -nt文件2
判断文件1的修改时间是否比文件2新(新,则为真)
文件1 -ot文件2
判断文件1的修改时间是否比文件2旧(旧,则为真)
文件1 -ef文件2
判断文件1是否和文件2的lnode号一致,可以理解为判断两个文件是否为同一个文件。这个判断可用于判断硬链接。
例如,执行:
ln /home/hunan/student.txt /home/hunan/bin/stu.txt
[ /home/hunan/student.txt -ef /home/hunan/bin/stu.txt ] && echoyes || echo no
上述命令先是创建了一个硬链接,然后判断指向的文件是否相同,结果为:yes
4.比较两个整数
测试选项
作用
整数1 -eq整数2
整数1等于整数2为真
整数1 -ne整数2
整数1不等于整数2为真
整数1 -gt整数2
整数1大于整数2为真
整数1 -lt整数2
整数1小于整数2为真
整数1 -ge整数2
整数1大于等于整数2为真
整数1 -le整数2
整数1小于等于整数2为真
例如,执行:
$[ 23 -gt 22 ] && echo yes || echo no
yes
$[ 23 -lt 22 ] && echo yes || echo no
no
5.比较两个字符串
测试选项
作用
-z 字符串
字符串为空返回真
-n 字符串
字符串非空返回真
字符串1==字符串2
字符串1和字符串2相等返回真
字符串1!=字符串2
字符串1和字符串2不相等返回真
例如,执行:
$name=mike
$[ -z $name ] && echo yes || echo no
no
$[ $name == mike ] && echo yes || echo no
yes
6.shell中的与,或,非
测试选项
作用
判断式1 -a判断式2
逻辑与
判断式1 -o判断式2
逻辑或
! 判断式
逻辑非
例如,执行:
$aa=11
$[ -n $aa -a "$aa" -gt 22 ] && echo yes || echo no
no
控制流程
1.单分支if条件语句
if [ 条件判断式 ];then 程序fi
或者
if [ 条件判断式 ] then 程序fi
注意:
1.要记得以fi结尾/2.条件判断式和中括号之间必须有空格/3.如果then和if在同一行要以 ; 分隔。
示例1:判断当前用户是否为root用户。思路:用env输出所有环境变量,用grep提取出USER变量,用cut将USER=XXX以“=”为分隔符切分,取切分后的第二个字符串即为当前用户名。命令之间以管道连接。
脚本内容:
#!/bin/bash#提取出用户名赋值给test变量test=$(env| grep USER | cut -d "=" -f 2)if [ $test == "root" ];then<span style="white-space:pre"></span>echo "this is root login."fi
注意:要给脚本执行权限才能执行(chmoda+x *.sh)。
示例2:判断分区使用率。当根分区使用率大于某一阈值,给出警告。思路:
df -h | grep sda4 | awk '{print $5}'| cut -d "%" -f 1
df -h打印分区信息,我这里的根分区挂在在sda4,用grep过滤出这一行,用awk打印出第五部分,在用cut切掉%号。即可得到使用率数值。
脚本内容:
#!/bin/bash#提取出当前根分区的使用率test=$(df -h | grep sda4 | awk '{print $5}' | cut -d "%" -f 1)if [ "$test" -gt 30 ];then echo "/ is full!"fi(这里为了体现程序作用,阈值取30%.)
2.双分支if语句
if[条件判断式 ] then 条件成立时执行语句 else 条件不成立时执行语句fi
示例3:用户输入一个路径,程序判断是否为一个目录。思路:用read命令读取用户输入,用-d判断是否为目录。
脚本内容:
#!/bin/bashread -t 30 -p "请输入路径:" pathif [ -d $path ];then echo "is directory!"else echo "not directory!"fi
示例4:判断apache服务是否启动。思路:用psaux列出所有进程,过滤出含有httpd但是不含grep的进程(因为grephttpd命令也会产生一个含有httpd的进程)
脚本内容:
#!/bin/bashtest=$(ps aux | grep httpd | grep -v grep)#如果字符串不为空if [ -n $test ]thenecho “$(date) httpd is ok” >> /tmp/autostart-acc.logelseecho “$(date) restart httpd !!” >> /tmp/autostart-err.log/etc/rc.d/init.d/httpd startfi
注意:这种方法,脚本名中不能含有httpd!
3.多分支if语句
if [ 条件判断式1 ]then当条件判断式1成立,执行语句elif [ 条件判断式2 ]then当条件判断式2成立,执行语句 . . . 省略 . . .else当所有条件判断式都不成立,执行语句fi
示例5:判断输入的文件类型
脚本内容:
#!/bin/bash#读入用户输入的路径read -t 30 -p 请输入路径名: pathif [ -z $path ]thenecho 请输入路径。exit 1elif [ ! -e $path ]thenecho 您输入的路径不存在!exit 2elif [ -f $path ]thenecho 您输入的是普通文件。elif [ -d $path ]thenecho 您输入的是目录。elseecho 您输入的是其它文件。fi
4.多分支case语句
case $变量名 in“值1”)如果变量的值等于值1,则执行程序1;;“值2”)如果变量的值等于值2,则执行程序2;;. . . 省略其它分支 . . .*)如果变量的值都不是以上的值,则执行此程序;;esac
注意:每次选择之后都要加上“双分号”!除了最后的*其它的值都要被双引号引起来。
示例6:根据用户输入做出不同反应。
#!/bin/bash read -t 30 -p '请输入你的选择 yes/no:' cho case $cho in "yes") echo 你的选择是yes ;; "no") echo 你的选择是no ;; *) echo 你的选择是其它。 ;; esac
5.for循环
语法1:
for 变量 in 值1 值2 值3...do程序done
示例7:循环打印数字
#!/bin/bashfor i in 1 2 3 4 5doecho $idone
示例8:批量解压缩
#!/bin/bashcd /root/testfor i in $(ls *.tar.gz *.gz)dotar -zxf $idone
语法2:
for ((初始值; 循环空值条件; 变量变化))do程序done
示例9:计算1+2+...+100
#!/bin/bash s=0 for ((i=1; i<=100; i=i+1)) do s=$(($s+$i)) done echo $s
6.while循环
while [ 条件判断式 ]do程序done
示例10:用while循环计算1+2+...+100
#!/bin/bash s=0 i=1 while [ $i -le 100 ] do s=$(($i+$s)) i=$(($i+1)) done echo "the sum is:"$s
7.until循环
until循环和while循环相反,until循环时只要条件判断式不成立则继续循环,一旦条件判断式成立则停止循环。
until [ 条件判断式 ]do程序done
示例11:用until循环计算1+2+...+100
#!/bin/bash s=0 i=1 until [ $i -gt 100 ] do s=$(($s+$i)) i=$(($i+1)) done echo 'the sum is:'$s
- shell中的条件判断与控制流程
- Shell编程之条件判断与流程控制
- shell编程(条件判断与流程控制)学习笔记
- Shell基础(五):条件判断与流程控制
- 十二.shell编程之条件判断与流程控制
- Linux-shell编程之条件判断与流程控制
- Linux之shell编程之条件判断与流程控制
- shell变成之条件判断和流程控制
- Shell编程之条件判断和流程控制
- Shell编程之流程控制语句(条件判断)
- shell中的条件判断
- php流程控制语句以及条件判断中的数据类型转换
- java流程控制条件判断
- shell:条件测试操作与流程控制语句
- linux课堂笔记--shell5条件判断与流程控制
- linux shell中的条件判断
- shell中的条件判断式
- Shell中的标志代表意义与条件判断(转)
- RadioButton单选按钮
- 【Bash百宝箱】shell内建命令之句点与source
- Hibernate的批量处理
- jquery中常用方法
- qt5.6.1+mingw492+opencv2.4.10+cmake3.4.1配置
- shell中的条件判断与控制流程
- 198. House Robber
- 透视投影的原理和实现
- 荣华小学访问
- lightoj 1145 - Dice (I)
- 1.适配器模式
- 【JZOJ 4786】小a的强迫症
- Xcode8.0 更新之后遇到的那些坑 实时更新
- IOS OpenGLES2.0 入门01 清空屏幕