shell 的条件表达式及逻辑操作符简单介绍
查看系统的shell:
cat /etc/shells
文件测试表达式:
-f 文件 文件存在且为普通文件则真,即测试表达式成立。
-d 文件 文件存在且为目录文件则真,即测试表达式成立。
-s 文件 文件存在且文件大小不为0则真,即测试表达式成立。
-e 文件 文件存在则真,即测试表达式成立。只要有文件就行,要区别 -f 。
-r 文件 文件存在且可读则真,即测试表达式成立。
-w 文件 文件存在且可写则真,即测试表达式成立。
-x 文件 文件存在且可执行则真,即测试表达式成立。
-L 文件 文件存在且为链接文件则真,即测试表达式成立。
a –nt b 文件a比文件b新则真,即测试表达式成立,根据文件修改时间来计算
a –nt b 文件a比文件b旧则真,即测试表达式成立,根据文件修改时间来计算
特别说明:这些操作符号对于[[]]、[]、test几乎是通用的,更多的操作符请man test查询。
普通文件测试表达式:
[root@lamp01 ~]# mkdir bqh1
[root@lamp01 ~]# ll -d ./bqh1
drwxr-xr-x. 2 root root 4096 1月 27 21:51 ./bqh1
[root@lamp01 ~]# [ -d bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -f bqh1.log ]&&echo 1||echo 0
0
[root@lamp01 ~]# touch ./bqh1.log
[root@lamp01 ~]# [ -f bqh1.log ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -e bqh1.log ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -e bqh2.log ]&&echo 1||echo 0
[root@lamp01 ~]# [ -r bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -w bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -x bqh1 ]&&echo 1||echo 0
1
[root@lamp01 ~]# chmod 000 bqh1
[root@lamp01 ~]# ll
d---------. 2 root root 4096 1月 27 21:51 bqh1
[root@lamp01 ~]# [ -x bqh1 ]&&echo 1||echo 0
1
提示:文件的读写执行等属性,不光是根据文件属性,而是当前执行脚本的用户根据测试选项是否真的可操作。
测试shell变量举例:
[root@lamp01 ~]# a=/etc/services
[root@lamp01 ~]# b=/etc/
[root@lamp01 ~]# [ -f $a ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -d $a ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -d $b ]&&echo 1||echo 0
1
特殊例子:如果变量不加双引号,测试结果可能不正确。
[root@lamp01 ~]# echo $c
[root@lamp01 ~]# [ -f "$c" ]&&echo ||echo [root@lamp01 ~]# [ -f $c ]&&echo ||echo
1 #$c明明不存在的,却返回1
使用条件表达式时,多个返回值时,可以使用大括号的用法,格式如下:
当条件不成立就会执行大括号内的所有命令内容:
[root@lamp01 ~]# [ -ne ]||{ echo "my name is bqh" ; echo "my name is jyw" ;}
my name is bqh
my name is jyw
[root@lamp01 ~]#
字符串测试表达式:
字符串测试操作符:
-z “字符串” 若串长度为0则真
-n ”字符串“ 若串长度不为0则真
“字符串1”=“字符串2” 若串1等于串2则真,可以使用‘==’代替‘=’
“字符串1”!=“字符串2” 若串1不等于串2则真,但不能用‘!==’代替‘!=’
测试如下:
[root@lamp01 ~]# [ -n "abc" ]&&echo ||echo [root@lamp01 ~]# [ -n "" ]&&echo ||echo [root@lamp01 ~]# [ -z "" ]&&echo ||echo [root@lamp01 ~]# [ -z "abc" ]&&echo ||echo [root@lamp01 ~]# [ ! -z "abc" ]&&echo ||echo [root@lamp01 ~]# a="bqh"
[root@lamp01 ~]# [ -n "$a" ]&&echo ||echo [root@lamp01 ~]# [ -z $a ]&&echo ||echo [root@lamp01 ~]# [ ! -z $a ]&&echo ||echo [root@lamp01 ~]# [ "$a" != "bqh1" ]&&echo ||echo [root@lamp01 ~]# [ "$a" = "bqh1" ]&&echo ||echo
等号两端空格带来的问题:
[root@lamp01 ~]# [ "abc"="" ]&&echo ||echo [root@lamp01 ~]# [ "abc" = "" ]&&echo ||echo
不加引号带来的问题:
[root@lamp01 ~]# a=""
[root@lamp01 ~]# [ $a = abc ]&&echo ||echo
-bash: [: =: unary operator expected [root@lamp01 ~]# [ $a = "abc" ]&&echo ||echo
-bash: [: =: unary operator expected [root@lamp01 ~]# [ "$a" = "abc" ]&&echo ||echo [root@lamp01 ~]#
特别注意:
1.比较符合两端有空格。
2.字符串测试操作符号务必要用“”引起来。
整数表达式:
-eq: ==或= 测试两个整数是否相等;比如 $A -eq $B
-ne: != 测试两个整数是否不等;不等,为真;相等,为假;
-gt: > 测试一个数是否大于另一个数;大于,为真;否则,为假;
-lt: < 测试一个数是否小于另一个数;小于,为真;否则,为假;
-ge: >= 大于或等于
-le: <= 小于或等于
在使用中中注意:
1、[]及test中使用字母模式。
2、在 (()) 和 [[]] 中使用符合模式。
提示:
“<”符号意思是小于,if[[ "$a" < "$b" ]],if [ "$a" \< "$b" ] 在单[]中需要转义,因为shell也用<和>重定向。
“>”符号意思是大于,if[[ "$a" > "$b" ]],if [ "$a" \> "$b" ] 在单[]中需要转义,因为shell也用<和>重定向。
“=”符号意思是等于,if[[ "$a" = "$b" ]],if [ "$a" = "$b" ] 在单[]中不需要转义。
测试:
[root@lamp01 ~]# [ 2>1 ] && echo 1 || echo 0
0 ==>这里的结果逻辑不对,条件应该成立,应该返回1
[root@lamp01 ~]# [ 2\>1 ] && echo 1 || echo 0
1 ==>转义后是正确的
[root@lamp01 ~]# [ 2 -eq 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 -gt 1 ] && echo 1 || echo 0
1
[root@lamp01 ~]# [ 2 -lt 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 -ge 1 ] && echo 1 || echo 0
1
[root@lamp01 ~]# [ 2 -le 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 = 1 ] && echo 1 || echo 0
0
[root@lamp01 ~]# [ 2 = 2 ] && echo 1 || echo 0
1
[root@lamp01 ~]# [ 2 != 2 ] && echo 1 || echo 0
0
“=” 和 “!=” 在[]中使用不需要转义,包含“>”和“<”的符号在[]中使用需要转义,对于数字不转义的结果未必会报错,但是结果可能会不对。
[root@lamp01 ~]# [[ 2 > 1 ]] && echo 1 || echo 0
1
[root@lamp01 ~]# [[ 2 > 11 ]] && echo 1 || echo 0 ====>只比较第一位,逻辑结果不对。
1
[root@lamp01 ~]# [[ 2 > 31 ]] && echo 1 || echo 0 ====>只比较第一位,逻辑结果不对。
0
数比较不要加双引号:系统脚本例子

整数比较推荐方法:
[ $numl -eq $num2 ] ===>注意空格,和比较符号
(($num1>$num2)) ===>无需空格,常规数据比较符号。
--------------------------------------------------------------------------------------------------------
测试结果结论:
1、整数加双引号也是对的。
2、[]用>号的写法语法没错,逻辑结果不对。
3、[[]]用-eq等的写法也是对的,[[]]用>写法也可能不对,只比较第一位,逻辑结果不对。
逻辑操作符
在[]和test中使用 在[[]]中使用 说明
-a && and与,两端都为真,则真
-o || or或,两端有一个真,则真
! ! not非,相反则为真
测试:
[root@lamp01 ~]# a1=/etc/rc.local
[root@lamp01 ~]# a2=/etc/services
[root@lamp01 ~]# [ -f "$a1" && -f "$a2" ]&&echo 1||echo 0
-bash: [: missing `]'
0
[root@lamp01 ~]# [ -f "$a1" -a -f "$a2" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [[ -f "$a1" && -f "$a2" ]]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -n "$a1" -a -z "$a2" ]&&echo 1||echo 0
0
[root@lamp01 ~]# [ -n "$a1" -o "$a1"="$a2" ]&&echo 1||echo 0
1
如果你非要单中括号加&&或||可以用以下方法:
[root@lamp01 ~]# a1=/etc/rc.local
[root@lamp01 ~]# a2=/etc/services
[root@lamp01 ~]# [ -f "$a1" ]||[ -e "$a2" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ -f "$a1" ]&&[ -e "$a2" ]&&echo 1||echo 0
1
!非逻辑符号:
[root@lamp01 ~]# [ -f "$a1" ]&&[ -e "$a2" ]&&echo 1||echo 0
1
[root@lamp01 ~]# [ ! -f "$a1" ]&&[ -e "$a2" ]&&echo 1||echo 0
0
[root@lamp01 ~]# test -f "$a1" -a -e "$a2" &&echo 1||echo 0
1
[root@lamp01 ~]# test ! -f "$a1" -a -e "$a2" &&echo 1||echo 0
0
提醒:
1、“-a” 和 “-o” 和“!”逻辑操作符号用于 [] 中使用。
2、“&&”和“||” 和“!”逻辑操作符号用户 [[]] 中使用。
3、注意括号两端,必须要有空格。
4、test用法和 [] 相同。
5、多个[]之间以及多个[[]]之间,或者任意混合中间逻辑操作符都是&&或||。
shell 的条件表达式及逻辑操作符简单介绍的更多相关文章
- shell之条件表达式
conditional expressions are used by the [[ compound command and the test and [ builtin commands. ari ...
- 从头认识Spring-1.14 SpEl表达式(1)-简单介绍与嵌入值
这一章节我们来讨论一下SpEl表达式的简单介绍与嵌入值. 1.SpEl表达式简单介绍 Spring Excpression Language (SpEL)语言支持在执行时操作和查询对象 事实上就是在执 ...
- Javascript基础系列之(五)条件语句(逻辑操作符)
javascript和其它语言一样,逻辑运算主要包括 与运算&& ,或运算 II 和非运算 ! 与运算(&&)是指两个条件都为true时,整个表达式为true,或运算 ...
- CentOS 7 Shell脚本编程第九讲 read命令简单介绍
测试代码 sqlSessionFactory.openSession(false).getMapper(StudentMapper.class).findStudentById(id)核心方法:org ...
- 怎样用 Bash 编程:逻辑操作符和 shell 扩展
学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...
- Shell编程-条件测试 | 基础篇
什么是Shell Shell是一个命令解释器,它会解释并执行命令行提示符下输入的命令.除此之外,Shell还有另一个功能,如果要执行多条命令,它可以将这组命令存放在一个文件中,然后可以像执行Linux ...
- Linux Shell脚本逻辑操作符简介
在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...
- shell中的条件表达式
条件表达式返回的结果都为布尔型 真为1,假为0 条件测试的表达式 [expression] [[expression]] test expression 这三种条件表达式的效果是一样的 比较符 整数比 ...
- Shell条件表达式
Shell编程中经常需要判断文件状态.字符串是否相等以及两个数值大小等情况,基于这些比较结果再做执行相关操作.本文主要讲述文件状态.字符串.数值大小的判断比较方法. 文件状态判断 文件状态的判断通常使 ...
随机推荐
- Maven项目报错:Missing artifact****和ArtifactDescriptorException: Failed to read artifact descriptor for***和Cannot change version of project facet Dynamic web module to 2.5
一.关于Cannot change version of project facet Dynamic web module to 2.5 具体查看博客:http://blog.csdn.net/ste ...
- Java 动态生成 PDF 文件
每片文章前来首小诗: 今日夕阳伴薄雾,印着雪墙笑开颜.我心仿佛出窗前,浮在半腰望西天. --泥沙砖瓦浆木匠 需求: 项目里面有需要java动态生成 PDF 文件,提供下载.今天我找了下有关了,系 ...
- 通过反射实现IOC功能
这段时间园子里有不少介绍IOC组件的文章,由于自己也一直在学习IOC的各种组件,及IOC的思想,常见的IOC组件很多:AutoFac.Ninject.Utity包括.NET自带的MEF等.由于今天周六 ...
- [转]在Node.js中使用RabbitMQ系列一 Hello world
本文转自:https://www.cnblogs.com/cpselvis/p/6288330.html 在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队 ...
- Oracle入门《Oracle介绍》第一章1-1
1.Oracle 简介 a.对象关系型的数据库管理系统 (ORDBMS) b.在管理信息系统.企业数据处理.因特网及电子商务等领域使用非常广泛 c.在数据安全性与数据完整性控制方面性能优越 d.跨操作 ...
- Linux中rsync备份服务部署
rsync介绍 rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份工具 在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输 ...
- AnyVal与AnyRef
AnyRef 是所有引用类型的基类.除了值类型,所有类型都继承自AnyRef . AnyVal AnyVal 所有值类型的基类, 它描述的是值,而不是代表一个对象. 它包括 9 个 AnyVal ...
- [android] 手机卫士欢迎页检测更新
客户端:去服务器获取最新的版本信息 服务器端: 版本信息,最新的版本2.0 最新版本的下载地址:http://xxxxxxxx/mobilesafe2.0.apk 版本的描述信息 客户端如果不升级新版 ...
- 现如今的CDN网站加速技术,细说CDN
CDN技术应用越来越广泛的被各大互联网公司所应用.已经成为了互联网企业离不开的一种网络运维方式.什么是CDN? CDN 利用全局负载均衡技术将用户的访问指向离用户最近的工作正常的流媒体服务器上,由流媒 ...
- 01-初始Java
1. 你学习编程的目的是什么?学习编程最快的办法是什么? 答:我喜欢计算机,想更多的了解计算机的原理:我认为学习最快的办法就是尝试,只有不断地在计算机上尝试编程,遇到错误, 解决错误,才能更快的学会编 ...