shell条件判断与流程控制
- 一 条件判断式语句
1.按文件类型进行判断
测试类型 | 作用 |
-b 文件 | 判断文件是否存在,并且是否为块设备文件(是块设备文件为真) |
-c 文件 | 判断文件是否存在,并且是否为字符设备文件(是字符设备设备文件为真) |
-d 文件 | 判断文件是否存在,并且是否为目录文件(是目录文件为真) |
-e 文件 | 判断文件是否存在,(存在为真) |
-f 文件 | 判断文件是否存在,并且是否为普通文件(是普通文件为真) |
-L 文件 | 判断文件是否存在,并且是否为符号链接文件(是符号链接文件为真) |
-p 文件 | 判断文件是否存在,并且是否为管道文件(是管道文件为真) |
-s 文件 | 判断文件是否存在,并且是否为非空(非空为真) |
-S 文件 | 判断文件是否存在,并且是否为套接字文件(是套接字文件为真) |
两种判断格式
- test -e /root/install.log
- [ -e /root/install.log ]
- [root@MacBook-Pro ~]# test -e /etc/passwd
- [root@MacBook-Pro ~]# [ -e /etc/passwd ]
- [root@MacBook-Pro ~]# echo $?
- [root@MacBook-Pro ~]# test -e /etc/passwd
- [root@MacBook-Pro ~]# echo $?
- [root@MacBook-Pro ~]# [ -e /etc/passwdhsdfkjashdf ]
- [root@MacBook-Pro ~]# echo $?
- [root@MacBook-Pro ~]# [ -d /root ] && echo "yes" || echo "no"
- yes
- [root@MacBook-Pro ~]#
2.按照文件权限进行判断
测试选项 | 作用 |
-r 文件 | 判断该文件是否存在,并且该文件是否拥有读权限 (有读权限为真) |
-w 文件 | 判断该文件是否存在,并且该文件是否拥有写权限 (有写权限为真) |
-x 文件 | 判断该文件是否存在,并且该文件是否拥有执行权限 (有执行权限为真) |
-u 文件 | 判断该文件是否存在,并且该文件是否拥有SUID权限 (有SUID权限为真) |
-g 文件 | 判断该文件是否存在,并且该文件是否拥有SGID权限 (有SGID权限为真) |
-k 文件 | 判断该文件是否存在,并且该文件是否拥有SBit权限 (有SBit权限为真) |
- [ucm@MacBook-Pro testpace]$ ll
- 总用量
- -rw-r--r--. ucm ucm 12月 : stu.log
- [ucm@MacBook-Pro testpace]$ [-w stu.log] && echo yes || echo no
- bash: [-w: 未找到命令...
- no
- #注意 :[] 括号中的判断式必须有空格
- [ucm@MacBook-Pro testpace]$ [ -w stu.log ] && echo yes || echo no
- yes
- [ucm@MacBook-Pro testpace]$
#该例子中该文件的权限只要有写权限,就判断为真,不管是其拥有者权限,还是所属组的权限。---------即:不能判断指定的权限。
3.两个文件之间进行比较
测试选项 | 作用 |
文件1 -nt 文件2 | 判断文件1的修改时间是否比文件2新 (如果新,则为真) |
文件1 -ot 文件2 | 判断文件1的修改时间是否比文件2旧 (如果旧,则为真) |
文件1 -ef 文件2 | 判断文件1与文件2的Inode号是否一致;可以理解为两个文件是否为同一个文件。用于判断是否是硬连接 |
- [ucm@MacBook-Pro testpace]$ ll
- 总用量
- -rw-r--r--. ucm ucm 12月 : stu.log
- [ucm@MacBook-Pro testpace]$ pwd
- /home/ucm/testpace
- [ucm@MacBook-Pro testpace]$ ln /home/ucm/testpace/stu.log /tmp/pace/stu.txt
- ln: 无法创建硬链接"/tmp/pace/stu.txt" => "/home/ucm/testpace/stu.log": 没有那个文件或目录
- [ucm@MacBook-Pro testpace]$ ln /home/ucm/testpace/stu.log /tmp/stu.txt
- [ucm@MacBook-Pro testpace]$ ll
- 总用量
- -rw-r--r--. ucm ucm 12月 : stu.log
- [ucm@MacBook-Pro testpace]$ cd /tmp/
- [ucm@MacBook-Pro tmp]$ ll
- 总用量 ***
- -rw-r--r--. ucm ucm 12月 : stu.txt
- [ucm@MacBook-Pro tmp]$ [ /home/ucm/testpace/stu.log -ef /tmp/stu.txt ] && echo yes || echo no
- yes
- [ucm@MacBook-Pro tmp]$
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 (小于等于为真) |
- JideMacBook-Pro:testpace jixiaodong$ [ -ge ] && echo yes || echo no
- yes
- JideMacBook-Pro:testpace jixiaodong$ [ -le ] && echo yes || echo no
- no
- JideMacBook-Pro:testpace jixiaodong$
5.字符串的判断
测试选项 | 作用 |
-z 字符串 | 判断字符串是否为空 (为空返回真) |
-n 字符串 | 判断字符串是否非空 (非空返回真) |
字符串1 == 字符串2 | 判断字符串1是否与字符串2相等 (相等返回真) |
字符串 != 字符串2 | 判断字符串1是否与字符串2不相等 (不相等返回真) |
- [ucm@MacBook-Pro ~]$ name=echohello
- [ucm@MacBook-Pro ~]$ [ -z "$name" ] && echo yes || echo no
- no
- [ucm@MacBook-Pro ~]$ [ -n "$name" ] && echo yes || echo no
- yes
- [ucm@MacBook-Pro ~]$
- [ucm@MacBook-Pro ~]$ aa=
- [ucm@MacBook-Pro ~]$ bb=22
此处是判断的字符串相等,如果需要判断数值相等,则需要使用 -ep- [ucm@MacBook-Pro ~]$ [ $aa==$bb ] && echo yes || echo no
- yes
- [ucm@MacBook-Pro ~]$ echo $AA
- [ucm@MacBook-Pro ~]$ echo $aa
- [ucm@MacBook-Pro ~]$ echo $bb
- [ucm@MacBook-Pro ~]$ [ "$aa"=="$bb" ] && echo yes || echo no
- yes
==号左右需要有空格!!!- [ucm@MacBook-Pro ~]$ [ "$aa" == "$bb" ] && echo yes || echo no
- no
- [ucm@MacBook-Pro ~]$
6.多重条件判断
测试选项 | 作用 |
判断式1 -a 判断式2 | 逻辑与 |
判断式1 -o 判断式2 | 逻辑或 |
! 判断 | 逻辑非 |
- [ucm@MacBook-Pro ~]$ echo $aa
- [ucm@MacBook-Pro ~]$ echo $bb
- [ucm@MacBook-Pro ~]$ [ -n "$aa" -a "$aa" -gt "$bb" ] && echo yes || echo no
- no
- [ucm@MacBook-Pro ~]$
二 单分支if语句
if [ 条件判断式 ] ;then
程序
fi
或者:
if [ 条件判断式 ]
then
程序
fi
- [ucm@MacBook-Pro testpace]$ cat user.sh
- #!/bin/bash
- test=$(env | grep "USER" | cut -d "=" -f )
- if [ "$test" == ucm ]
- then
- echo "now user is $test"
- fi
- [ucm@MacBook-Pro testpace]$ ./user.sh
- now user is ucm
- [ucm@MacBook-Pro testpace]$
- [ucm@MacBook-Pro testpace]$ cat df.sh
- #!/bin/bash
- source=$(df -h | grep "/cl-root" | awk '{print $5}' | cut -f -d "%")
- if [ $source -gt ]
- then
- echo "this is full"
- fi
- [ucm@MacBook-Pro testpace]$ ./df.sh
- this is full
- [ucm@MacBook-Pro testpace]$
三 双分支条件语句
if [ 条件判断式 ]
then
条件成立时,执行
else
条件不成立时,执行
fi
- [ucm@MacBook-Pro testpace]$ ll
- 总用量
- -rw-rw-r--. ucm ucm 1月 : =
- -rwxr-xr-x. ucm ucm 1月 : df.sh
- -rwxr-xr-x. ucm ucm 1月 : dir.sh
- -rwxr-xr-x. ucm ucm 1月 : echo.sh
- -rw-r--r--. ucm ucm 12月 : stu.log
- -rwxr-xr-x. ucm ucm 1月 : user.sh
- [ucm@MacBook-Pro testpace]$ pwd
- /home/ucm/testpace
- [ucm@MacBook-Pro testpace]$ ./dir.sh
- please input a dir: /home/ucm
- this is dir
- [ucm@MacBook-Pro testpace]$ ./dir.sh
- please input a dir: /home/ucm/testpace/stu.log
- this is not dir
- [ucm@MacBook-Pro testpace]$ cat dir.sh
- #!/bin/bash
- read -t -p "please input a dir: " dir
- if [ -d "$dir" ]
- then
- echo "this is dir"
- else
- echo "this is not dir"
- fi
- [ucm@MacBook-Pro testpace]$
- [ucm@MacBook-Pro testpace]$ cat apache.sh
- #!/bin/bash
- apache=$(ps -aux | grep httpd | grep -v "grep")
- if [ -n "$apache" ]
- then
- echo "$(date) httpd is ok !" >> /tmp/apache.log
- else
- service httpd start
# 此处写成service httpd start,并不稳妥,我的linux的/etc/rc.d/init.d/中没有找到httpd文件。- echo "$(date) restart httpd !" >> /tmp/apache.log
- fi
- [ucm@MacBook-Pro testpace]$
四 多分支if语句
if [ 条件判断式1 ]
then
条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
条件判断式2成立时,执行程序2
····
else
当所有条件判断式都不成立时,执行此程序
fi
举个例子:计算器
- [ucm@MacBook-Pro testpace]$ cat calc.sh
- #!/bin/bash
- read -t -p "请输入第一个数字:" num1
- read -t -p "请输入第二个数字:" num2
- #通过read命令接收用户输入,并存储到变量num1/num2中
- read -t -p "请输入运算类型【+-*/】:" ope
- #通过read命令接收计算的类型
- if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
- then
- test1=$(echo $num1 | sed 's/[0-9]//g')
- test2=$(echo $num2 | sed 's/[0-9]//g')
- if [ -z "$test1" -a -z "$test2" ]
- then
- if [ "$ope" == "+" ]
- then
- result=$(( $num1 + $num2 ))
- elif [ "$ope" == '-' ]
- then
- result=$(( $num1 - $num2 ))
- elif [ "$ope" == '*' ]
- then
- result=$(( $num1 * $num2 ))
- elif [ "$ope" == '/' ]
- then
- if [ "$num2" != '' ]
- then
- result=$(( $num1 / $num2 ))
- else
- echo "分母不可为0"
- exit
- fi
- else
- echo "请输入正确的运算符"
- exit
- fi
- else
- echo "请输入数字"
- exit
- fi
- else
- echo "请输入数值与运算类型"
- exit
- fi
- echo "$num1 $ope $num2: $result"
- [ucm@MacBook-Pro testpace]$ ./calc.sh
- 请输入第一个数字:
- 请输入第二个数字:
- 请输入运算类型【+-*/】:+
- + :
- [ucm@MacBook-Pro testpace]$ ./calc.sh
- 请输入第一个数字:
- 请输入第二个数字:
- 请输入运算类型【+-*/】:-
- - :
- [ucm@MacBook-Pro testpace]$ ./calc.sh
- 请输入第一个数字:
- 请输入第二个数字:
- 请输入运算类型【+-*/】:*
- * :
- [ucm@MacBook-Pro testpace]$ ./calc.sh
- 请输入第一个数字:
- 请输入第二个数字:
- 请输入运算类型【+-*/】:/
- / :
- [ucm@MacBook-Pro testpace]$ ./calc.sh
- 请输入第一个数字:
- 请输入第二个数字:
- 请输入运算类型【+-*/】:/
- 分母不可为0
- [ucm@MacBook-Pro testpace]$ ./calc.sh
- 请输入第一个数字:
- 请输入第二个数字:
- 请输入运算类型【+-*/】:/
- / :
- [ucm@MacBook-Pro testpace]$ ./calc.sh
- 请输入第一个数字:
- 请输入第二个数字:
- 请输入运算类型【+-*/】:*
- * :
- [ucm@MacBook-Pro testpace]$
举个例子:判断输入的文件类型
- [ucm@MacBook-Pro testpace]$ cat file.sh
- #!/bin/bash
- read -t -p "please input filename : " file
- if [ -z "$file" ]
- then
- echo "必须输入信息"
- exit
- elif [ ! -e "$file" ]
- then
- echo "请输入文件名"
- exit
- elif [ -f "$file" ]
- then
- echo "$file 是一个普通文件"
- elif [ -d "$file" ]
- then
- echo "$file 是一个目录文件"
- else
- echo "$file 是其他类型文件"
- fi
- [ucm@MacBook-Pro testpace]$ ./file.sh
- please input filename :
- 必须输入信息
- [ucm@MacBook-Pro testpace]$ ./file.sh
- please input filename : /home/ucm
- /home/ucm 是一个目录文件
- [ucm@MacBook-Pro testpace]$ ./file.sh
- please input filename : /home/ucm/testpace/file.sh
- /home/ucm/testpace/file.sh 是一个普通文件
- [ucm@MacBook-Pro testpace]$ ./file.sh
- please input filename : dfadasf
- 请输入文件名
- [ucm@MacBook-Pro testpace]
五 多分支case语句
case $变量名 in
"值1")
如果变量值等于值1,则执行程序1
;;
“值2”)
如果变量值等于值2,则执行程序2
;;
---省略其他条件分支---
*)
如果变量值不是以上的值,则执行此程序
;;
esac
举个例子:选项
- [ucm@MacBook-Pro testpace]$ ./case1.sh
- consumer choose
- cbg choose
- ebg choose
- 请输入你的选择代号:
- your choose egb
- [ucm@MacBook-Pro testpace]$ ./case1.sh
- consumer choose
- cbg choose
- ebg choose
- 请输入你的选择代号:
- your choose consumer
- [ucm@MacBook-Pro testpace]$ ./case1.sh
- consumer choose
- cbg choose
- ebg choose
- 请输入你的选择代号:
- your choose cbg
- [ucm@MacBook-Pro testpace]$ ./case1.sh
- consumer choose
- cbg choose
- ebg choose
- 请输入你的选择代号:
- 请输入正确的选择!
- [ucm@MacBook-Pro testpace]$ cat case1.sh
- #!/bin/bash
- echo "consumer choose 1"
- echo "cbg choose 2"
- echo "ebg choose 3"
- read -t -p "请输入你的选择代号:" cho
- case $cho in
- "")
- echo "your choose consumer"
- ;;
- "")
- echo "your choose cbg"
- ;;
- "")
- echo "your choose egb"
- ;;
- *)
- echo "请输入正确的选择!"
- ;;
- esac
- [ucm@MacBook-Pro testpace]$
六 for循环
语法一
for 变量 in 值1 值2 值3 值4 ····
do
程序
done
eg:
- [ucm@MacBook-Pro testpace]$ cat for.sh
- #!/bin/bash
- for i in
- do
- echo $i
- done
- [ucm@MacBook-Pro testpace]$ ./for.sh
- [ucm@MacBook-Pro testpace]$
- [ucm@MacBook-Pro testpace]$ cat untar-gz.sh
- #!/bin/bash
- #批量解压缩脚本
- cd /home/ucm/testpace
- ls *.tar.gz > ls.log
- for i in $(cat ls.log)
- do
- tar -zxvf $i &>/dev/null
- done
- rm -rf /home/ucm/testpace/ls.log
- [ucm@MacBook-Pro testpace]$
上方脚本中tar -zxvf $i &>/dev/null 可以写成tar -zxf $i &>/dev/null 因为在脚本中执行,用户不需要查看输出,所以可以省略v,详细信息不作输出。
语法二
for ((初始值;循环控制条件;变量变化))
do
程序
done
- [ucm@MacBook-Pro testpace]$ cat add.sh
- #!/bin/bash
- #从1加到100
- s=
- for((i=;i<=;i++))
- do
- s=$(( $s + $i ))
- done
- echo "The sum of 1+2+~~~+99+100 is $s"
- [ucm@MacBook-Pro testpace]$ ./add.sh
- The sum of ++~~~++ is
- [ucm@MacBook-Pro testpace]$
- [ucm@MacBook-Pro testpace]$ cat useradd.sh
- #!/bin/bash
- #批量添加指定数量的用户
- read -p "Please input user name : " -t name
- read -t -p "Please input the number of users : " num
- read -t -p "Please input the passwd of user : " pass
- if [ -n "$name" -a -n "num" -a -n "$pass" ]
- then
- y=$( echo $num | sed 's/[0-9]//g')
- if [ -z "$y" ]
- then
- for(( i=;i<=$num;i++ ))
- do
- /usr/sbin/useradd $name$i &>/dev/null
- #用/usr/bin/passwd --stdin接收$pass的信息,给每个用户赋予初始密码
- echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
- done
- else
- echo "请输入正整数"
- exit
- fi
- else
- echo "input info is null !!!"
- exit
- fi
- [ucm@MacBook-Pro testpace]$ sudo ./useradd.sh
- Please input user name : useraa
- Please input the number of users :
- Please input the passwd of user :
- [ucm@MacBook-Pro testpace]$ cat /etc/passwd | grep useraa
- useraa1:x::::/home/useraa1:/bin/bash
- useraa2:x::::/home/useraa2:/bin/bash
- useraa3:x::::/home/useraa3:/bin/bash
- [ucm@MacBook-Pro testpace]$
批量删除一般用户
- [ucm@MacBook-Pro testpace]$ cat userdel.sh
- #!/bin/bash
- #批量删除用户
- for i in $(cat /etc/passwd | grep -v root | grep "/bin/bash" | cut -f -d ":")
- do
- userdel -r $i
- done
- [ucm@MacBook-Pro testpace]$
七 while循环和until循环
while 条件成立,则进行循环
until 条件不成立,则进行循环
while [ 条件判断式 ]
do
程序
done
- [ucm@MacBook-Pro testpace]$ cat whileadd.sh
- #!/bin/bash
- #从1加到100
- i=
- s=
- while [ $i -le ]
- #如果变量i的值小于等于100,则执行循环
- do
- s=$(( $s + $i ))
- i=$(( $i + ))
- done
- echo "The sum is : $s"
- [ucm@MacBook-Pro testpace]$ ./whileadd.sh
- The sum is :
- [ucm@MacBook-Pro testpace]$
until
- [ucm@MacBook-Pro testpace]$ cat whileadd.sh
- #!/bin/bash
- #从1加到100
- i=
- s=
- #while [ $i -le ]
- #如果变量i的值小于等于100,则执行循环
- until [ $i -gt ]
- #循环直到变量i的值大于100,则停止循环
- do
- s=$(( $s + $i ))
- i=$(( $i + ))
- done
- echo "The sum is : $s"
- [ucm@MacBook-Pro testpace]$ ./whileadd.sh
- The sum is :
- [ucm@MacBook-Pro testpace]$
shell条件判断与流程控制的更多相关文章
- [Shell]条件判断与流程控制:if, case, for, while, until
---------------------------------------------------------------------------------------------------- ...
- Shell脚本 (三) 条件判断 与 流程控制
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 六.条件判断 1.基本语法 [ condition ](注意condition 前后要有空格) 注意:条 ...
- shell编程-条件判断与流程控制
1.条件判断式 按照文件类型进行判断: 两种判断格式: test -e /root/install.log [ -e /root/install.log ] 判断命令是否正确执行: [ -d /roo ...
- shell条件测试和流程控制
一.条件测试操作 1.test 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值 格式:test 表达式 2.常见的测试类型 ①测试文件状态 格式:[ 操作符 文件 ...
- Shell条件测试和流程控制-4
- 【重点】Shell入门教程:流程控制(3)条件判断式的真假值
之前曾提到,在Bash中什么是真什么是假,是以命令的结束状态是否为0来做判断.传回0,即为真:传回非0,即为假. 在Bash中,这种可以影响程序流程的式子,称为条件判断式.判断式的操作数分成“单元”及 ...
- 【重点】Shell入门教程:流程控制(2)条件判断的写法
第三节:条件判断的写法 if条件判断中,if的语法结构中的“条件判断”可以有多种形式.测试结果是真是假,就看其传回的值是否为0. 条件测试的写法,有以下10种: 1.执行某个命令的结果 这里的命令,可 ...
- 《Shell脚本学习指南》学习笔记之变量、判断和流程控制
变量 定义变量 可以使用export和readonly来设置变量,export用于修改或打印环境变量,readonly则使得变量不得修改.语法: export name[=word] ... read ...
- shell(shell变量、条件表达式、流程控制)
本章内容: 变量 运算 if语句 for语句 while语句 break.continue 实例 shell变量 1.shell变量简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数 ...
随机推荐
- apachetop 实时监测web服务器运行状况
apachetop 实时监测web服务器运行状况 我们经常会需要知道服务器的实时监测服务器的运行状况,比如哪些 URL 的访问量最大,服务器每秒的请求数,哪个搜索引擎正在抓取我们网站?面对这些问题 ...
- 开窗函数 First_Value 和 Last_Value
在Sql server 2012里面,开窗函数丰富了许多,其中带出了2个新的函数 First_Value 和 Last Value .现在来介绍一下这2个函数的应用场景. 首先分析一下First_Va ...
- SNMP与MIB
简单网络管理协议(SNMP:Simple Network Management Protocol)是一套网络管理协议,注意,SNMP是一个强大的网络管理协议,而不是"简单"的.利用 ...
- java工具类之Graphics
利用重写paint()方法绘画出一个坐标轴: package huaxian; import java.awt.Color; import java.awt.FlowLayout; import ja ...
- Java使用MyEclipse构建webService简单案例
什么是WebServices? 它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的web应用程序分支,是自包含.自描述.模块化的应用,可以发布.定位.通过web ...
- Git开发分支管理
远程仓库有master和dev分支的情况 1. 克隆代码 git clone https://somewhere.com/master-dev.git 2. 查看所有分支 git branch --a ...
- 开发 ASP.NET vNext 初步总结(使用Visual Studio 14 CTP1)
新特性: vNext又称MVC 6.0,不再需要依赖System.Web,占用的内存大大减少(从前无论是多么简单的一个请求,System.Web本身就要占用31KB内存). 可以self-host模式 ...
- Hello session
1. session 随想 HTTP 的无状态,也就是说,每次请求都是独立的线程.这里所说的无状态其实就是一种隔离的意思.举个例子比如购物车,你先选择A商品,加入购物车,这里就是A线程,然后在选择B商 ...
- __new__静态方法
__new__静态方法 新式类都有一个__new__的静态方法,它的原型是object.__new__(cls[, ...]) cls是一个类对象,当你调用C(*args, **kargs)来创建一个 ...
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...