1. 逻辑操作符
  在书写测试表达式时,可以使用表1.1中的逻辑操作符实现复杂的条件测试
  表1.1逻辑连接符

提示:
  ! 中文意思是反:与一个逻辑值相反的逻辑值
  -a 中文意思是与(and &&):两个逻辑值都为“真”,返回值才为“真”,反之为“假”
  -o 中文意思是或(or ||):两个逻辑值只要有一个为“真” ,返回值就为“真”

逻辑操作符运算规则

结论:-a &&的运算规则:只有两端都是1才为真
真 1 假0
---------------------
and 1*0=0 假
and 1*1=1 真
and 0*0=0 假
两端都是1才为真 结论:-o,|| 两端都是0才为假,任何一端不为0都是真
---------------------
or 1+0=1 真
or 1+1=2 真
or 0+1=1 真
or 0+0=0 假
两端都是0才为假,不为0就是真。

2. 条件测试举例
   下面举一些条件测试的例子。为了清晰的显示测试结果,我们在屏幕上输出1(表示真)或0(表示假)表示测试结果。
   提示:这和前面的状态变量"$?"返回0为真不一样哟

[root@test-1 scripts]# [ -f "$file1" ] && echo 1 || echo 0     #这是条件表达式的用法
0
[root@test-1 scripts]# if [ -f "$file1" ];then echo 1;else echo 0;fi #这是后面要讲的if条件句的语法。
0

提示:
  1. 以上两条语句的功能是等同的。
  2. 变量$file加了双引号,这是编程的好习惯,可以防止很多意外的错误发生。
3. 文件测试举例
   首先我们定义file1和file2两个变量,并分别赋予两个系统文件路径及文件名的值。

[root@test-1 scripts]# file1=/etc/services;file2=/etc/rc.local
[root@test-1 scripts]# echo $file1 $file2
/etc/services /etc/rc.local

范例1:对单个文件的测试:

[root@test-1 scripts]# [ -f "$file1" ] && echo 1 || echo 0   #文件存在且为普通文件所以为真(1)
1
[root@test-1 scripts]# [ -d "$file1" ] && echo 1 || echo 0 #是文件不是目录所以为假(0)
0
[root@test-1 scripts]# [ -s "$file1" ] && echo 1 || echo 0 #文件存在且大小不为0,所以为真(1)
1
[root@test-1 scripts]# [ -e "$file1" ] && echo 1 || echo 0 #文件存在所以为真(1)
1
[root@test-1 scripts]# dir1=/etc
[root@test-1 scripts]# [ -e "$dir1" ] && echo 1 || echo 0
1

特殊例子:如果变量不加双引号,结果可能就不正确:

[root@test-1 scripts]# echo $file7

[root@test-1 scripts]# [ -f $file7 ] && echo 1 ||echo 0
1 #明明$file 7不存在还返回1.
[root@test-1 scripts]# [ -f "$file7" ] && echo 1 ||echo 0
0

范例2:把变量内容换成文件实体

[root@test-1 scripts]# [ -f /etc/services ] && echo 1 ||echo 0
1
[root@test-1 scripts]# [ -f /etc/service ] && echo 1 ||echo 0
0
[root@test-1 scripts]# [ -f "/etc/service" ] && echo 1 ||echo 0
0
[root@test-1 scripts]# [ -f "/etc/services" ] && echo 1 ||echo 0
1

范例3:生产环境系统nfs启动脚本的条件测试的内容

[root@test-1 scripts]# more /etc/init.d/nfs
# Source networking configuration.
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
#如果/etc/sysconfig/network 文件存在就加载文件
# Check for and source configuration file otherwise set defaults
[ -f /etc/sysconfig/nfs ] && . /etc/sysconfig/nfs
#如果/etc/sysconfig/nfs 文件存在就加载文件
特别提示:系统脚本是我们学习编程的第一标杆,要多参考

范例4:多文件单中括号[ ]与或非测试
  可用与(-a和&&)、或(-o 和 ||)、非(!)蒋多个条件表达式连接起来,接着上面的变量测试。

[root@test-1 scripts]# [ -f "$file1" -o -e "$file2" ] && echo 1 || echo 0
1
[root@test-1 scripts]# [ -f "$file1" -a -e "$file2" ] && echo 1 || echo 0
1
[root@test-1 scripts]# [ -f "$file1" || -e "$file2" ] && echo 1 || echo 0
-bash: [: missing `]' #用法不对了。你知道那不对么?
-bash: -e: command not found
0 提醒:前面我们已经讲解过了。
1. "-a"和"-o"逻辑操作符号用于[ ]中使用
2. "&&" 和 "||" 逻辑操作符号用于[[ ]]中使用。
3. 注意括号两端,必须要有空格。
如果你很倔,非要单中括号加&&或||
[root@test-1 scripts]# [ -f "$file1" ] || [ -e "$file2" ] && echo 1 || echo 0
1
[root@test-1 scripts]# [ -f "$file1" ] && [ -e "$file2" ] && echo 1 || echo 0
1

 范例6:简易高效的文件判断例子

在做测试判断时,不一定非要按照前面的方法。直接用后者做测试判断有时更简洁。例如:
范例:
[root@test-1 scripts]# [ -f "$file1" ] && echo 1
1
[root@test-1 scripts]# [ -f "$file3" ] || echo 0
0 系统范例:/etc/init.d/nfs
[ -x /usr/sbin/rpc.nfsd ] || exit 5
[ -x /usr/sbin/rpc.mountd ] || exit 5
[ -x /usr/sbin/exportfs ] || exit 5

范例7:学习问答案例:判断条件后面执行多条命令语句。

#[ 判断 ] || 命令 这种句式,怎么执行一组命令?类似 [ 判断 ] || (命令1 命令2 命令3 ) 这样的内容
#希望实现
# if [条件]
# then
# do something
# else
# 命令1
# 命令2
# 命令3
# fi
#这样的效果? #解答:
# 可以使用条件表达式,大括号的用法,格式如下。当条件不成立时就会执行大括号内的所有命令内容:(用于脚本中)
[root@test-1 scripts]# cat test.sh
[ 3 -ne 3 ] || {
echo "I am aa "
echo "I am bb"
exit 1 }

# 如果写在一行里面,里面的每个命令还需要用分号结尾,如下所示:
[root@test-1 scripts]# [ 3 -ne 3 ] || { echo "I am aa ";echo "I am bb";exit 1;}
I am aa
I am bb
logout
#提示:本例的用法很简洁,但是理解起来不如if条件句容易,因此,请根据自身情况使用

 拓展

1) 结尾小括号用法:
[root@test-1 scripts]# [ 3 -eq 3 ] && echo "JDK安装成功"||(echo "jdk安装失败,请检查"&& exit 1)
JDK安装成功
[root@test-1 scripts]# [ 3 -eq 2 ] && echo "JDK安装成功"||(echo "jdk安装失败,请检查"&& exit 1)
jdk安装失败,请检查

2) 结尾中括号用法:
[root@test-1 scripts]# [ 3 -eq 2 ] && echo "JDK安装成功"||[echo "jdk安装失败,请检查"&& exit 1]
-bash: [echo: command not found

3) 结尾大括号用法:
[ 3 -eq 3 ] && echo "JDK安装成功" || {echo "jdk安装失败,请检查"; exit 1}
[ 3 -eq 3 ] && echo "JDK安装成功" || {
echo "jdk安装失败,请检查"
exit 1
}

  

 

shell-逻辑操作符讲解与文件条件测试多范例多生产案例的更多相关文章

  1. shell-整数测试多范例多生产案例举例

    1. 整数测试举例范例1:整数条件测试举例 root@test-1 ~]# a1=10;a2=13 [root@test-1 ~]# echo $a1 $a2 10 13 [root@test-1 ~ ...

  2. shell 字符串比较 算数比较 文件条件测试

    set-group-id即set-gid -->授予了程序其所在组的访问权限 set-user-id即set-uid -->授予了程序其拥有者的访问权限而不是其使用者的访问权限 set-g ...

  3. Shell基础(二):Shell中的数值运算、条件测试操作、使用if选择结构

    一.Shell中的数值运算 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 使用expr.$[ ].let等整数运算工具:定义变量X=1234,然后计算X与78 ...

  4. 【转】shell学习笔记(四)——条件测试

    1 test 条件检测 当我要检测系统上面某些文件或者是相关的属性时,利用 test 这个命令来工作真是好用得不得了, 举例来说,我要检查 /home/oracle/zy是否存在时,使用: test ...

  5. shell 逻辑操作符

    Shell还提供了与( -a ).或( -o ).非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o&qu ...

  6. Shell学习笔记——算数运算与条件测试

    算数运算 1. 使用let命令 #!/sbin/bash var1=2 var2=3 let sum=var1+var2 echo $sum 使用let命令式,变量前不需要加$号 只用于整数运算,不适 ...

  7. shell编程:条件测试与比较(六)

    条件测试方法综述 test条件测试的简单语法及测试 范例6-1 测试文件(在test命令中使用-f选项:文件存在且为不同文件则表达式成立) [root@adminset ~]# test -f fil ...

  8. Shell编程中的条件判断(条件测试)

    Shell中的条件判断(测试)类型: 1) 整数测试 2) 字符测试 3) 文件测试 条件测试的表达式:        (注: expression 与 [] 之间空格不能省略) [ expressi ...

  9. shell 的条件表达式及逻辑操作符简单介绍

    查看系统的shell: cat /etc/shells 文件测试表达式: -f 文件  文件存在且为普通文件则真,即测试表达式成立. -d 文件  文件存在且为目录文件则真,即测试表达式成立. -s ...

随机推荐

  1. 对于分布式Job的思考

    引言 在清理Github的时候,发现以前写的一个简单的分布式任务分发系统ClawHub/task-distribution,使用了zk的选主与队列,调度器使用spring的ThreadPoolTask ...

  2. 用 Shader 写个完美的波浪

    前言 皮皮最近接到了一个小需求: 美术小姐姐:皮皮皮皮,你能不能做奶茶? 我:??? 美术小姐姐:就是那种,奶茶的轮廓加上动态水波纹~

  3. 常用Linux Shell命令,了解一下!

    目录 1 前言 2 正文 2.1 关机/重启 2.2 echo 2.3 vim文本编辑器 2.3.1 最基本用法 2.3.2 常用快捷键 2.3.3 查找/替换 2.4 拷贝/删除/移动/重命名 2. ...

  4. Dos拒绝服务Sockstress/TearDrop 泪滴攻击(二)

    Sockstress放大攻击原理:攻击者向目标发送一个很小的流量,但是会造成产生的攻击流量是一个巨大的.成百上千倍上万倍流量被放大的一个效果,才适合作为一个拒绝服务攻击效果.(实现攻击者很小的流量打垮 ...

  5. 老男孩教育python全栈第22期Day15笔记

    day15 今日内容大纲 昨日内容回顾作业讲解 装饰器:完美的呈现了开放封闭原则.装饰器的本质:闭包. def wraper(f): def inner(*args, **kwargs): " ...

  6. 文件存到aws的S3后, 调用getimagesize失败分析

    一.问题 将图片在windows下用图片查看器修改后,上传到s3中,调用getimagesize获取图片信息总是返回false,其它图片正常: 代码如下: $fileName = 's3://sdk1 ...

  7. SpringBoot框架:两个方法同时调用时父方法使内部方法的DataSource注解失效的解决办法

    一.问题如下: 使用的是SpringBoot框架:通过AOP和自定义注解完成druid连接池的动态数据源切换(三)中的两个数据库spring_boot_demo和other_data. 在UserCo ...

  8. 2018尚硅谷最新SpringCloud免费视频教程

    [课程内容] 01.前提概述 02.大纲概览 03.从面试题开始 04.微服务是什么 05.微服务是什么2 06.微服务与微服务架构 07.微服务优缺点 08.微服务技术栈有哪些 09.为什么选择Sp ...

  9. 基于python的extract_msg模块提取outlook邮箱保存的msg文件中的附件

    笔者保存了一些outlook邮箱中保存的一些msg格式的邮件文件,现需要将其中的附件提取出来, 当然直接在outlook中就可以另存附件,但outlook默认是不支持批量提取邮件中的附件的 思考过几种 ...

  10. 搜索引擎学习(一)初识Lucene

    一.Lucene相关基础概念 定义:一个简易的工具包,实现文件搜索的功能,支持中文,关键字,多条件查询,凡是文件名或文件内容包含的都查出来. 数据分类:结构化数据(固定格式或有限长度的数据)和非结构化 ...