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. RGB打水印在YUV图片上

    一. 概述 将RGB图片打在YUV上需要注意的是, 字体之外应该透明, 否则背景也会被覆盖不好看,  所以RGB必须有透明度,  本测试格式为BMP ARGB8888(也即B是最低字节, A是最高字节 ...

  2. Python实践项目2

    #南昌理工学院人工智能学院实验室WORKSHOP实践项目 import time import random SCRIPT_NPC_SCHOOL_SISTER = ['你好!', '你好!', '你是 ...

  3. 业务级别MySQL

    业务级别MySQL 目录 业务级别MySQL 1. 权限管理和备份 1. 用户管理 1. SQLyog可视化操作 2. SQL命令操作 2. MySQL备份 3. 规范数据库设计 1. 为什么需要设计 ...

  4. Dockerfile使用,示例

    1.dockerfile介绍 镜像分类: 基础镜像:例如centos.Ubuntu.alpine 环境镜像:例如Java.php.go 项目镜像:将项目与环境镜像打包一起 2.Dockerfile常用 ...

  5. DevOps-实践心得

    基于最近几年从事与DevOps的相关实践,对这篇文章的观点深有体会,所以记录在这里.加粗部分是我比较深有体会的,但是对于最后作者对于"运维"有些悲观,我有点不敢苟同,反而对于运维的 ...

  6. 超详细!盘点Python中字符串的常用操作

    在Python中字符串的表达方式有四种 一对单引号 一对双引号 一对三个单引号 一对三个双引号 a = 'abc' b= "abc" c = '''abc''' d = " ...

  7. 解决IDEA打包出现中文乱码的问题

    这主要是maven编译时编码问题导致的. 解决办法: 1.在IDEA的File里面打开Settings. 2.找到Runner,在VM Options输入-DarchetypeCatalog=inte ...

  8. js中的鼠标滚轮事件

    ## 事件对象 event 1 event事件对象,表示用来获取事件的详细信息,比如得到鼠标的横坐标:事件对象.clientX(clientX是可视区坐标) window.onclick = func ...

  9. vue | vue实现列表同时展开与单独展开

    需求:每个li标签在点击的时候,都同时展开. 但是碰见几个问题: 1.如果点第一个li 所有li都会展开: 2.点击第一个li,第一个li展开,点击第二个li,第一个li闭合,第二个li展开 这两种情 ...

  10. JavaFX桌面应用-构建程序框架

    看到JavaFX应用很多人都会说JavaFX应用太丑了,确实JavaFX比起Qt.MFC.Delphi这些界面确实丑了一点,但也不是没有可以美化的空间. 跟网页一样,单纯HTML不加任何CSS的时候也 ...