Linux shell编程学习笔记12:布尔运算和逻辑运算

Linux  Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、逻辑、字符串、文件测试等多种运算。前面几节我们陆续研究了  Linux shell编程 中的 字符串运算、算术运算和关系运算,今天我们来研究 Linux shell编程中的的布尔运算、逻辑运算。

一、布尔运算

(一)布尔运算符功能说明

运算符说明备注
!非运算,表达式为 true 则返回 0(false),否则返回 1(true)。not
-o或运算,有一个表达式为 true 则返回 1(true),否则返回 0(false)。or
-a与运算,两个表达式都为 true 才返回1(true),否则返回 0(false)。and

(二)布尔运算实例

1.操作数为数值

user @ host : ~ $ a=1
user @ host : ~ $ b=-1
user @ host : ~ $ c=3
user @ host : ~ $ if [ ! $a ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [ ! $b ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [ ! $b == $a ]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [  $b == $a -o $b ==$c ]; then echo "true"; else echo "false"; fi
bash: [: -1: 需要一元表达式
false
user @ host : ~ $ if [  $b == $a -o $b == $c ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [  $b == $a -a $b == $c ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [  $b == $a -o $b == $b ]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [  $b == $a -a $b == $b ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ 

2.操作数为字符串

user @ host : ~ $ a="a"

user @ host : ~ $ b="b"
user @ host : ~ $ c="c"
user @ host : ~ $ if [ ! $a ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [  $b == $a -o $b == $c ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [  $b == $a -a $b == $c ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [  $b == $a -o $b == $c ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [  $b == $a -a $b == $b ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [  $b == $a -o $b == $b ]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ 

3.操作数为true 和 false

user @ host : ~ $ c=true
user @ host : ~ $ if [ $c ]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [ ! $c ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ f=false
user @ host : ~ $ if [ $f ]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [ ! $f ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [ $c -o $f ]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [ $c -a $f ]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [ $f -a $c ]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [ ! $f -a $c ]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ echo $f
false
user @ host : ~ $ echo $c
true
user @ host : ~ $ echo `expr $f == true `
0
user @ host : ~ $ echo `expr $c == true `
1
user @ host : ~ $ echo `expr $c == false `
0
user @ host : ~ $ echo `expr $f == false `
1
user @ host : ~ $ 

比较奇怪的是,对于变量f,我们初始化其值为false后,执行以下命令的结果。

(1)命令:

if [ $f ]; then echo "true"; else echo "false"; fi

执行结果是: true

(2)命令:

if [ ! $f ]; then echo "true"; else echo "false"; fi
执行结果是: false

(3)尽管变量c的值为true,但变量f的值为false,所以 表达式$c -a $f  的值应为false

但命令: if [ $c -a $f ]; then echo "true"; else echo "false"; fi
执行结果是:true

之所以出现这些问题,是因为 Linux shell脚本编程中,虽然有布尔运算符和布尔运算,但不能直接将 true 或 false 作为布尔值赋给一个变量!

其实在上面的实例中,命令 c=true 是将 字符串 true 而不是布尔值true 赋给变量c

同样的,命令 f=false 是将 字符串 false 而不是布尔值 false 赋给变量f

所以,上面这个实例中操作数也是字符串!

二、逻辑运算

(一)逻辑运算符功能说明

运算符说明
&&逻辑的 AND
||逻辑的 OR

这些运算符与汇编语言和C/C++/JavaScript 等语言是一样的。

 (二)逻辑运算实例

一般表达式运算只用1个对[],而逻辑去处要用2对[]。

1.操作数为 true 和 false

user @ host : ~ $ c=true
user @ host : ~ $ f=false
user @ host : ~ $ if [ $c && $f ]; then echo "true"; else echo "false"; fi
bash: [: 缺少 `]'
false
user @ host : ~ $ if [[ $c && $f ]]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [[ $c || $f ]]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [[ $c || ! $f ]]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [[ ! $c || ! $f ]]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [[ ! $c ||  $f ]]; then echo "true"; else echo "false"; fi
true

user @ host : ~ $ if [[ ! $c &&  $f ]]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [[ $c && ! $f ]]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ 

以上命令中,c=true, f=false,有些命令的执行结果比较奇怪。

比如 表达式 $c && $f 的值应该是false,但比较奇怪的是命令:

if [[ $c && $f ]]; then echo "true"; else echo "false"; fi

执行结果是:true

究其原因,跟上面说的一样,命令c=true, f=false,所赋值的类型都是字符串,则不是布尔型。

2.操作数为数值

user @ host : ~ $ c=1
user @ host : ~ $ f=3
user @ host : ~ $ if [ $c && $f ]; then echo "true"; else echo "false"; fi
bash: [: 缺少 `]'
false
user @ host : ~ $ if [[ $c && $f ]]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ c=0
user @ host : ~ $ if [[ $c && $f ]]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ b=-1
user @ host : ~ $ if [[ $c -gt $b  && $f -gt $b  ]]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [[ $b -gt $c  && $b -gt $f  ]]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [[ $b -gt $c  || $b -gt $f  ]]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ 

3.操作数为字符串

user @ host : ~ $ a="a"
user @ host : ~ $ b="b"
user @ host : ~ $ c="c"
user @ host : ~ $ if [[ $a ==  $b  && $a == $c  ]]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [[ $a ==  $b  || $a == $c  ]]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ if [[ $a !=  $b  || $a == $c  ]]; then echo "true"; else echo "false"; fi
true
user @ host : ~ $ if [[ $a !=  $b  && $a == $c  ]]; then echo "true"; else echo "false"; fi
false
user @ host : ~ $ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/105692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纯文本邮件发送:java

1.打开jdk的conf下的security文件的.security,找到并删除&#xff0c;权限问题建议复制文件修改后替换 jdk.tls.disabledAlgorithmsSSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \ DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL 删除后的内容 然…

数据结构 - 4(栈和队列6000字详解)

一&#xff1a;栈 1.1 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原…

php如何查找地图距离

要在PHP中使用高德地图、百度地图或腾讯地图获取位置信息&#xff0c;您可以使用它们的相应API服务。以下是获取位置信息的一般步骤&#xff1a; 思路: 获取API密钥&#xff1a;首先&#xff0c;您需要注册并获取相应地图服务提供商的API密钥。这将允许您访问他们的API以获取位…

Python学习基础笔记六十九——文本2

二进制&#xff08;字节&#xff09;模式&#xff1a; 文本文件&#xff0c;纯文本文件就是保存文本字符串的文件&#xff0c;跟word还不一样&#xff0c;word是富文本文件。 其实就文件存储的底层来说&#xff0c;不管什么类型的文件&#xff08;文本、视频、图片、word、Ex…

rsync 备份工具(附rsync+inotify 实时同步部署实例)

rsync 备份工具(附rsyncinotify 实时同步部署实例&#xff09; 1、rsync概述1.1关于rsync1.2rsync 的特点1.3工作原理 2、rsync相关命令2.1基本格式和常用选项2.2启动和关闭rsync服务2.3下行同步基本格式2.4上行同步基本格式2.5免交互2.5.1指定密码文件2.5.2rsync-daemon方式2.…

2.9 深入GPU硬件架构及运行机制

五、GPU技术要点 1.SMID和SIMT SIMD&#xff08;Single Instruction Multiple Data&#xff09;是单指令多数据&#xff0c;在GPU的ALU&#xff08;在Core内&#xff09;单元内&#xff0c;一条指令可以处理多维向量&#xff08;一般是4D&#xff09;的数据。比如&#xff0c…

宅在家里也能干的副业,每天挣60—300元,人人可做

想在家搞副业&#xff0c;每天挣60-300元&#xff0c;大家觉得难吗&#xff1f;我告诉你&#xff0c;一点也不难。找对路子&#xff0c;足不出户也能搞钱。今天我就给大家分享一下三个网上靠谱的副业&#xff0c;门槛低上手快&#xff0c;只需一部手机&#xff0c;每天利用碎片…

Hazelcast系列(三):hazelcast集成(服务器/客户端)

系列文章 Hazelcast系列(一)&#xff1a;初识hazelcast Hazelcast系列(二)&#xff1a;hazelcast集成&#xff08;嵌入式&#xff09; Hazelcast系列(三)&#xff1a;hazelcast集成&#xff08;服务器/客户端&#xff09; Hazelcast系列(四)&#xff1a;hazelcast管理中心 …

动态规划:918. 环形子数组的最大和

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《算法》 文章目录 前言一、题目解析二、解题思路解题思路状态表示状态转移方程初始化填表顺序返回值 三、代码实现总结 前言 本篇文章仅是作为小白的我的一些理解&#xff0c;&#xff0c;…

docker安装skyWalking笔记

确保安装了docker和docker-compose sudo docker -v Docker version 20.10.12, build 20.10.12-0ubuntu4 sudo docker-compose -v docker-compose version 1.29.2, build unknown 编写docker-compose.yml version: "3.1" services: skywalking-oap:image: apach…

ELF和静态链接:为什么程序无法同时在Linux和Windows下运行?

目录 疑问 编译、链接和装载&#xff1a;拆解程序执行 ELF 格式和链接&#xff1a;理解链接过程 小结 疑问 既然我们的程序最终都被变成了一条条机器码去执行&#xff0c;那为什么同一个程序&#xff0c;在同一台计算机上&#xff0c;在 Linux 下可以运行&#xff0c;而在…

《机器学习》第5章 神经网络

文章目录 5.1 神经元模型5.2 感知机与多层网络5.3 误差逆传播算法5.4 全局最小与局部最小5.5 其他常见神经网络RBF网络ART网络SOM网络级联相关网络Elman网络Boltzmann机 5.6 深度学习 5.1 神经元模型 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络&#xff0c;它…

如何做好数据分析中的数据可视化?

数据可视化在数据分析中扮演着重要的角色&#xff0c;它帮助我们更好地理解和传达数据的特征、趋势和规律。以下是关于如何做好数据分析中的数据可视化的详细介绍。 一、准备工作 1. 理解数据 在进行数据可视化之前&#xff0c;首先要对数据有一个清晰的理解。了解数据的来源…

Yakit工具篇:简介和安装使用

简介(来自官方文档) 基于安全融合的理念&#xff0c;Yaklang.io 团队研发出了安全领域垂直语言Yaklang&#xff0c;对于一些无法原生集成在Yak平台中的产品/工具&#xff0c;利用Yaklang可以重新编写 他们的“高质量替代”。对于一些生态完整且认可度较高的产品&#xff0c;Y…

JavaScript 通过数组对JSON key字段进行排序

这里我以vue为例 不过json排序用的js方式 任何前端项目都可以通过js完成 我们组件代码现在是这样的 <template><div><div v-for "item in navCateList" :key "item.id">{{ item.name }}</div></div> </template>&…

使用.NET实现WOL唤醒远程开机

文章目录 1. 背景2. 关于 WOL2.1 WOL 工作原理2.2 开启网卡唤醒功能 3. 快速验证3.1 局域网 Wake on Lan 应用3.2 Ubuntu 的 etherwake 命令4. 代码实现4.1 创建.NET控制台应用程序4.2 编写代码4.3 运行应用程序 5. 最后 1. 背景 家居自动化是现代智能家居的重要组成部分&…

[ROS2系列] ubuntu 20.04测试rtabmap

目录 背景&#xff1a; 一、配置 turtlebot3 二、安装RTAB-Map ROS2包&#xff1a; 三、启动 Turtlebot3 模拟器&#xff1a; 四、启动 RTAB 地图&#xff1a; 五、启动导航&#xff08;nav2_bringup应安装软件包&#xff09;&#xff1a; 背景&#xff1a; 1、设备&…

杀死僵尸进程ZooKeeperMain

关闭Hadoop后jps发现还有个进程ZooKeeperMain没有关闭&#xff0c;使用kill -9 <>也没有用&#xff0c;这种就是僵尸进程&#xff0c;需要用父进程ID来杀死 解决方法 话不多说&#xff0c;直接上解决方案&#xff0c; 1. 第一步 清楚需要关闭的进程ID&#xff0c;我…

项目配置vue.config jsconfig babel.config .prettierc .env .eslintrc

.env 在一个产品的前端开发过程中&#xff0c;一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境&#xff0c;然后才能正式的发布。对应每一个环境可能都会有所差异&#xff0c;比如说服务器地址、接口地址、websorket地址…… 等等。在各个环境切换的时候&am…

小程序 | 小程序后端用什么语言开发比较好

目录 ♣️ 引言 选择合适的后端语言 推荐使用Node.js Node.js 的优点 其他备选语言 ♣️ 小结 ♣️ 引言 小程序的兴起已经成为了当今移动互联网时代的热点之一&#xff0c;而小程序后端的好坏直接影响着小程序的使用体验&#xff0c;因此&#xff0c;选择一种好的语言来…