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. idea中右击的快捷键都找不到 Diagrams

    今天突然发现了一件很恐怖的事情,那就是我的IDEA的右击中找不到Diagrams了,因为我是用这个东西打开 .bpmn文件生成png的,突然没了.. 说一下解决吧 在FIle -> settin ...

  2. [java]将多个文件压缩成一个zip文件

    此文进阶请见:https://www.cnblogs.com/xiandedanteng/p/12155957.html 方法: package zip; import java.io.Buffere ...

  3. 容器服务 TKE 上服务暴露的几种方式

    预备知识 1. K8S 上 Service 类型 ClusterIP 通过集群的内部 IP 暴露服务,选择该值,服务只能够在集群内部可以访问,这也是默认的 ServiceType. NodePort ...

  4. 嵌入式Linux软链接使用技巧

    软链接概述 软链接是Linux下常用的一种共享文件方式.目录的方式,这种方式类似于Windows下的快捷方式.一般一个文件或者目录在不同的路径都需要的时候,可以通过创建软链接的方式来共享,这样只系统下 ...

  5. python 3 while嵌套

  6. swift基本数据类型使用

    swift基本数据类型的使用之一: 字符串的使用 swift String的使用 1.字符串的定义 1> 不可变字符串的定义 2> 可变字符串的定义 2.获取字符串的长度 3.字符串的拼接 ...

  7. Win10安装Tensorflow-gpu遇到Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问

    最近因为上课需要安装Anaconda和Tensorflow,安装Anaconda后再使用 Tensorflow官网提供的pip安装Tensorflow-GPU方法会出现如下错误: 解决方法:在安装命令 ...

  8. [LeetCode]3. 无重复字符的最长子串(滑动窗口)

    题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc ...

  9. [SSM项目]三-日志Logback

    Logback介绍 Logback的主要模块 logback-access :与service容器集成,提供通过http访问日志的功能.即第三方软件可以通过这个模块来访问日志. logback-cla ...

  10. DVWA sql注入low级别

    DVWA sql注入low级别 sql注入分类 数字型注入 SELECT first_name, last_name FROM users WHERE user_id = $id 字符型注入 SELE ...