Linux_Shell变量及运算符-05
一、Shell基础
1.1 什么是shell
Shell脚本语言是实现Linux/UNIX系统管理及自W动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系。
当命令不在命令行中执行,而是从一个文件中执行时,该文件就是shell脚本。
Shell是一种解释型编程语言,不需要编译,执行时也是按行执行。
Shell脚本是由解释器解释执行的,常见的解释器有:bash dash ash ksh sh等
特点:
shell脚本是普通的文本文件,由流程控制逻辑和命令构成。
shell脚本通常以.sh作为后缀名,但不是必须的。
1.2 什么是Shell脚本
命令、变量和流程控制语句等有机的结合起来
shell脚本擅长处理纯文本类型的数据,而linux中,几乎所有的配置文件,日志,都是纯文本类型文件
1.3 脚本语言的种类
1、编译型语言
定义:指用专用的编译器,针对特定的操作平台(操作系统)将某种高级语言源代码一次性翻译成可被硬件平台直接运行的二进制机器码(具有操作数,指令、及相应的格式),这个过程叫做编译(./configure make makeinstall );编译好的可执行性文件(.exe),可在相对应的平台上运行(移植性差,但运行效率高)。。 典型的编译型语言有, C语言、C++等。
另外,Java语言是一门很特殊的语言,Java程序需要进行编译步骤,但并不会生成特定平台的二进制机器码,它编译后生成的是一种与平台无关的字节码文件(*.class)(移植性好的原因),这种字节码自然不能被平台直接执行,运行时需要由解释器解释成相应平台的二进制机器码文件;大多数人认为Java是一种编译型语言,但我们说Java即是编译型语言,也是解释型语言也并没有错。
2、解释型语言
定义:指用专门解释器对源程序逐行解释成特定平台的机器码并立即执行的语言;相当于把编译型语言的编译链接过程混到一起同时完成的。
解释型语言执行效率较低,且不能脱离解释器运行,但它的跨平台型比较容易,只需提供特定解释器即可。
常见的解释型语言有, Python(同时是脚本语言)与Ruby等。
3、脚本语言
定义:为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。
特点:程序代码即是最终的执行文件,只是这个过程需要解释器的参与,所以说脚本语言与解释型语言有很大的联系。脚本语言通常是被解释执行的,而且程序是文本文件。
典型的脚本语言有,JavaScript,Python,shell等。
4、其他常用的脚本语句种类
shell脚本的优势在于处理操作系统底层的业务 (linux系统内部的应用都是shell脚本完成)因为有大量的linux系统命令为它做支撑。2000多个命令都是shell脚本编程的有力支撑,特别是grep、awk、sed等。例如:一键软件安装、优化、监控报警脚本,常规的业务应用,shell开发更简单快速,符合运维的简单、易用、高效原则.
1.4 系统中的shell
在计算机系统中,Shell是一个非常重要的组成部分,它充当了操作系统与用户之间的接口。Shell可以理解为一种命令解释器,它接收用户输入的命令,然后将这些命令转换为操作系统可以理解的格式,并将结果返回给用户。根据使用环境的不同,Shell可以分为图形界面Shell和命令行Shell两大类。
1.4.1、图形界面Shell
图形界面Shell就是我们常说的桌面环境。在桌面环境中,用户可以通过鼠标、图标和菜单等图形元素来启动、停止和监视进程。这种Shell提供了直观的操作界面,使得用户无需记忆复杂的命令即可完成各种操作。常见的图形界面Shell包括KDE、GNOME等,它们分别应用于不同的操作系统或发行版中。
1.4.2、命令行Shell
命令行Shell是文本形式的交互界面,用户在命令行中输入命令,然后按Enter键执行。这种Shell要求用户具备一定的命令行操作知识,但提供了更高的灵活性和效率。常见的命令行Shell包括Bash、Sh、Korn Shell(Ksh)、Z Shell(Zsh)以及C Shell(Csh)及其增强版Tcsh等。其中,Bash是Linux和Unix系统中最常见的Shell,它提供了丰富的功能和良好的兼容性。
说白了就是:
shell解释器,用户和操作系统内核之间的桥梁
shell介于操作系统内核与用户之间,负责接收用户输入的操作指令(命令),并运行和解释,将需要执行的操作传递给操作系统内核并执行
shell程序在系统中充当了一个”命令解释“的角色
1.4.3 shell的常见种类
Linux shell脚本主要基于几种不同的shell环境,每种环境都有其特定的语法和功能。最常见的shell包括Bash(Bourne Again SHell)、Sh(Bourne Shell)、Zsh(Z Shell)、Ksh(Korn Shell)和Csh/Tcsh(C Shell及其增强版)。在这些shell中,Bash是最广泛使用的,因为它在大多数Linux发行版和macOS中都是默认的shell。
Bash(Bourne Again SHell)
Bash是Bourne Shell的一个增强版本,它兼容于Bourne Shell(sh)的语法,并增加了许多新的特性,如命令历史、命令补全、作业控制、shell函数等。Bash脚本是Linux下最常见的脚本类型。
Sh(Bourne Shell)
Sh是最早的Unix shell之一,由Steve Bourne编写。尽管它现在不如Bash流行,但许多系统脚本和应用程序仍然使用它,因为它保持了最小的依赖性和广泛的兼容性。
Zsh(Z Shell)
Zsh是一个功能强大的shell,它提供了比Bash更多的特性和定制选项。Zsh的用户界面和扩展功能使其非常适合高级用户和开发人员。然而,由于它的复杂性,它在脚本编写中的普及程度不如Bash。
Ksh(Korn Shell)
Ksh是由David Korn开发的,旨在将C Shell和Bourne Shell的优点结合起来。Ksh在Unix系统上非常流行,尤其是在一些商业Unix发行版中。然而,在Linux环境中,它的使用相对较少。
Csh/Tcsh(C Shell及其增强版)
C Shell是由Bill Joy编写的,其语法类似于C语言。Tcsh是C Shell的一个增强版本,提供了更多的功能和改进。然而,C Shell和Tcsh在Linux环境中的使用也相对较少,因为它们与Bash相比在脚本编写方面缺乏一些灵活性和功能。
1.4.5 查看系统中的命令解释器
要查看系统上所有可用的shell,可以查看/etc/shells
文件。这个文件列出了系统上所有被认可的shell路径。
cat /etc/shells
输出内容:
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
1.5 脚本书写规范
1.5.1 选择解释器
开头的"#!"字符又称为幻数,在执行bash脚本的时候,内核会根据"#!"后的解释器来确定该用那个程序解释这个脚本中的内容。
[root@localhost /]# head -1 /etc/init.d/*
==> /etc/init.d/netconsole <==
#!/bin/bash
==> /etc/init.d/network <==
#! /bin/bash
==> /etc/init.d/tomcat <==
#!/bin/bash
==> /etc/init.d/vmware-tools <==
#!/bin/sh
==> /etc/init.d/vmware-tools-thinprint <==
#!/bin/sh
-
/etc/init.d/netconsole
、/etc/init.d/network
、/etc/init.d/tomcat
使用了#!/bin/bash
,这表明这些脚本应该由Bash shell来执行。Bash是许多Linux发行版的默认shell,提供了丰富的功能和良好的兼容性。 -
/etc/init.d/vmware-tools
和/etc/init.d/vmware-tools-thinprint
使用了#!/bin/sh
,这表明这些脚本应该由sh shell来执行。尽管sh通常指的是Bourne Shell,但在许多系统上,/bin/sh
可能指向一个与Bash兼容但功能较少的shell,比如Almquist Shell(ash)或Dash(Debian Almquist Shell)。
1.5.2 开发的规范
1.5.2.1、命名规范
- 脚本文件名:
- 应以
.sh
为扩展名,例如script-name.sh
。 - 命名应简洁明了,能够反映脚本的功能或用途。
- 应以
- 变量命名:
- 建议使用全部大写字母,如
APACHE_ERR_NUM
,语义要清晰,能够正确表达变量的含义。 - 多个单词连接使用“_”号连接,如
G_WORK_DIR
。 - 局部变量可以使用驼峰语法,即第2个单词的首字母大写,如
oldboyTraining
,或者首字母大写,也可以全大写或小写。 - 尽量避免使用无含义的字符或数字,例如避免直接使用数字
22
作为变量名或条件判断的值。
- 建议使用全部大写字母,如
- 函数命名:
- 使用单词首字母大写,如
CreateFile
,并且要语义清晰。 - 注意前后缀的使用,如后缀为
Max
则为最大值,Min
为最小值,前缀Is
为判断型函数,Get
则为取值函数。
- 使用单词首字母大写,如
- 模块和脚本命名:
- 模块的启动和停止脚本统一命名为
start_{模块名}.sh
和stop_{模块名}.sh
。 - 监控脚本可以以
*_mon.sh
为后缀,控制脚本以*_ctl.sh
为后缀。 - 模块(及其脚本和二进制程序)命名应代表其特性和功能,避免使用个人名字缩写等形式命名。
- 模块的启动和停止脚本统一命名为
- 解释器声明:
- 脚本的第一行应指定脚本解释器,如
#!/bin/bash
或#!/usr/bin/env bash
- 脚本的第一行应指定脚本解释器,如
1.5.2.2 代码风格
- 代码结构:
- 成对的内容(如大括号
{}
、中括号[]
等)尽量一次性写出来,防止遗漏。 - 流程控制语句(如if、for、while等)应一次性书写完成,再添加具体内容。
- 通过缩进让代码更易读,通常使用两个空格或一个tab键进行缩进。
- 成对的内容(如大括号
- 变量引用:
- 引用变量时,若变量前后都有字符,则用
${变量名}
;当变量内容为字符串时,用"${变量名}"
;当变量内容为整数时,可直接用$变量名
。
- 引用变量时,若变量前后都有字符,则用
- 代码注释:
- 尽量使用英文注释,避免中文注释可能带来的乱码问题。
- 注释应清晰明了,说明代码的作用、参数、返回值等信息。
- 函数定义:
- 在函数名前加上
function
保留字(尽管在某些情况下可以省略,但为了规范建议加上)。 - 函数定义时,应明确函数的用途、参数、返回值等信息。
- 在函数名前加上
1.5.2.3 注释规范
- 文件/模块说明:
- 说明模块的主要用途、版本信息、输入输出文件、依赖工具及其版本信息等。
- 注释中的路径给出的相对路径都必须是相对于该模块安装时生成的根目录。
- 重要函数说明:
- 对于重要函数,需说明函数用途、参数、返回值、作者、版本等信息。
- 存放位置:
- 服务控制脚本统一放置在
/service/scripts
目录下;如果多个运维人员,可以放在以各自用户命名的二级目录下,如/server/scripts/username
。
- 服务控制脚本统一放置在
- 命名规范:
- 确保脚本和二进制程序的命名不会与其他脚本和二进制程序重名。
1.6 shell脚本的编写/执行/调试
1.6.1 echo
打印命令 echo
[root@localhost ~]# echo [选项] [输出内容]
选项:
-
-e:支持反斜线控制的字符转换(具体参见表 1)
-
-n:取消输出后行末的换行符号(内容输出后不换行)
1.6.2 echo参数说明
-
参数 参数说明 -n 不要追加换行 -e 启用下列反斜杠转义的解释 -E 显式地抑制对于反斜杠转义的解释 \n 换行 \r 回车 \t 横向制表符 \b 退格 \v 纵向制表符 \c 抑制更多的输出
1.6.3 第一个shell脚本文件
[root@localhost demo01]# touch text01.sh
[root@localhost demo01]# ls
text01.sh
[root@localhost demo01]# vim text01.sh
在shell编程中,通常情况下,#代表注释,但是第一行的#是一个特例。
#! /bin/sh是shell脚本的一个标志,声明这个script使用的shell。第一行的#!是一个约定标记, 它告诉脚本这段脚本需要什么解释器来执行. 第二行的echo命令则负责向屏幕上输出一句话。
使用vi编辑器编写完shell脚本之后,使用./脚本文件名 来执行脚本文件。
此时报错是因为文件并没有可执行权限,所以报了权限不够错误。
报错原因:
根据下面截图也可以看出,text01.sh的文字颜色是白色,并不是绿色,所以也可以看出它并没有执行权限,因此我们要赋权限, 可以使用chmod 775 text01.sh命令或者chmod u+x text.sh命令来赋权限。
其实运行shell程序共有三种方法,除了给文件赋予可执行权限外,还有另外两种方法。
1.chmod +x使文件具有可执行权限, 直接运行
2.直接调用解释器, 将脚本文件作为参数传入 (比如bash hi.sh)
3.使用source(也可用.代替)执行文件
二、 Shell的变量
变量可以分为三类:环境变量(全局变量)、普通变量(局部变量)、 特殊变量
-
环境变量:也可称为全局变量,可以在创建他们的Shell及其派生出来的任意子进程shell中使用,环境变量又可分为自定义环境变量和Bash内置的环境变量
-
普通变量:也可称为局部变量,只能在创建他们的Shell函数或Shell脚本中使用。普通变量一般是由开发者用户开发脚本程序时创建的。
-
特殊变量:脚本内置的具有特殊用途的变量
2.1 环境变量
使用 env/declare/set/export -p 命令查看系统中的环境变量,输出方式稍有不同。
[root@localhost demo01]$ env
[root@localhost demo01]$ export -p:
输出一个系统中的 环境变量
2.2 普通变量
本地变量在用户当前的Shell生存期的脚本中使用。例如,本地变量OLDBOY取值为bingbing,这个值在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,本地变量值将无效。
注意:$用来获取变量,=前后不加空格
编写文件,创建变量
注意:
单引号字符串的限制:单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号里可以有变量,可以出现转义字符。
2.2.1 变量中引号的使用
-
只有在变量的值中有空格的时候,会使用引号。
-
单引号与双引号的区别在于,是否能够解析特殊符号。
-
变量使用反引号赋值,及使用${}获取参数值
2.2.2 定义变量名技巧
-
变量名只能为字母、数字或下划线,只能以字母或下划线开头。
-
变量名的定义要有一定的规范,并且要见名知意。示例:
ClsnAge=22 #每个单词的首字母大写的写法 clsn_age=22 #单词之间用"_"的写法 clsnAgeSex=man #驼峰语法:首个单词的首字母小写,其余单词首字母大写 CLSNAGE=22 #单词全大写的写法
-
一般的变量定义、赋值常用双引号;简单连续的字符串可以不加引号;希望原样输出时使用单引号。
-
希望变量的内容是命令的解析结果时,要用反引号'',或者用$()把命令括起来再赋值。
2.3 特殊变量
2.3.1 位置变量
常用的特殊位置参数说明
位置变量 | 作用说明 |
---|---|
$0 | 获取当前执行的shell脚本的文件名,如果执行脚本带路径那么就包括脚本路径。 |
$n | 获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,如果n大于9用大括号括起来{10},参数以空格隔开。 |
$# | 获取当前执行的shell脚本后面接的参数的总个数 |
$* | 获取当前shell的所有传参的参数,不加引号同$@;如果给$加上双引号,例如: “$”,则表示将所有的参数视为单个字符串,相当于“112$3”。 |
$@ | 获取当前shell的所有传参的参数,不加引号同$*;如果给$@加上双引号,例如: “$@”,则表示将所有参数视为不同的独立字符串,相当于“$1” “$2”“$3” “……”,这是将参数传递给其他程序的最佳方式,因为他会保留所有内嵌在每个参数里的任何空白。 |
当“$*”和“$@”都加双引号时,两者有区别,都不加双引号时,两者无区别。 |
2.3.2 进程状态变量
Shell进程的特殊状态变量说明
位置变量 | 作用说明 |
---|---|
$? | 获取执行上一个指令的执行状态返回值(0为成功,非零为失败),这个变量最常用 |
$$ | 获取当前执行的Shell脚本的进程号(PID),这个变量不常用,了解即可 |
$! | 获取上一个在后台工作的进程的进程号(PID),这个变量不常用,了解即可 |
$_ | 获取在此之前执行的命令或脚本的最后一个参数,这个变量不常用,了解即可 |
2.4 定义变量的方式
2.4.1 变量的方式
-
直接赋值:name=zhangsan
-
传参 (传递参数):name=$1
-
交互式设置变量,使用read命令
2.4.1 read命令说明
获取输入内容,在命令行中使用
在脚本中使用
2.5 变量的子串
2.5.1 变量子串说明
表达式 | 说明 |
---|---|
${parameter} | 返回变量$parameter的内容 |
${#parameter} | 返回变内容的长度(按字符),也适用于特殊变量 |
${parameteri:offset} | 在变量${parameter}中,从位置offset之后开始提取子串到结尾 |
${parameter:offset:length} | 在变量${parameter}中,从位置offset之后开始提取长度为length的子串 |
${parameter#word} | 从变量${parameter}开头开始删除最短匹配的word子串 |
${parameter##word} | 从变量${parameter}开头开始删除最长匹配的word子串 |
${parameter%word} | 从变量${parameter}结尾开始删除最短匹配的word子串 |
${parameter%%word} | 从变量${parameter}结尾开始删除最长匹配的word子串 |
${parameter/pattem/string} | 使用string代替第一个匹配的pattern |
${parameter//pattem/string} | 使用string代替所有匹配的pattern |
2.5.2 特殊扩展变量说明
表达式 | 说明 |
---|---|
${parameter:-word} | 如果parameter的变量值为空或未赋值,则会返回word字符串并替代变量的值用途.如果变量未定义,则返回备用的值,防止变量为空值或因未定义而导致异常 |
${parameter:=word} | 如果parameter的变量值为空或未赋值,则设置这个变量值为word,并返回其值。位置变量和特殊变量不适用用途:基本同上一个${parameter>word},但该变量又额外给parameter变量赋值了 |
${parameter:?word} | 如果parameter变量值为空或未赋值,那么word字符串将被作为标准错误输出,否则输出变量的值。用途:用于捕捉由于变量未定义而导致的错误,并退出程序 |
${parameter:+word} | 如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值 |
2.6 变量的数值计算
仅支持整数的运算
注意:1.空格 2.括号:(),(()),[],[[]]
echo $((数学运算表达式))
打印字符串
$[]运算符
let命令
let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。
expr 命令
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
1)整数计算
2)比较操作符
比较操作符< <= = == != >= >用法示例。其中"<"和">"是正则表达式正的锚定元字符,且"<"会被shell解析为重定向符号,所以需要转义或用引号包围。
这些操作符会首先会将两端的参数转换为数值,如果转换成功,则采用数值比较,如果转换失败,则按照字符集的排序规则进行字符大小比较。比较的结果若为true,则expr返回1,否则返回0。
3)字符串表达式
-
'STRING : REGEX':执行模式匹配
-
'match STRING REGEX':等价于'STRING : REGEX'。
-
'substr STRING POSITION LENGTH':返回STRING字符串中从POSITION开始,长度最大为LENGTH的子串。
-
'index STRING CHARSET':CHARSET中任意单个字符在STRING中最前面的字符位置。如果在STRING中完全不存在CHARSET中的字符,则返回0。
-
'length STRING':返回STRING的字符长度。
4)逻辑连接符号“&”与“|”:判断是否为0
"&"表示如果两个参数同时满足非空且非0,则返回第一个参数的值,否则返回0。且如果发现第一个参数为空或0,则直接跳过第二个参数不做任何计算。
"|"表示如果第一个参数非空且非0,则返回第一个参数值,否则返回第二个参数值,但如果第二个参数为空或为0,则返回0。且如果发现第一个参数非空或非0,也将直接跳过第二个参数不做任何计算。
2.7 bc 命令
bc 命令是任意精度计算器语言,通常在linux下当计算器用。它类似基本的计算器, 使用这个计算器可以做基本的数学运算。
安装bc依赖于base源
yum -y install bc
查看bc环境
bc命令:
语法:bc (选项) (参数)
-i:强制进入交互式模式; -l:定义使用的标准数学库; -w:对POSIX bc的扩展给出警告信息; -q:不打印正常的GNU bc环境信息; -v:显示指令版本信息; -h:显示指令的帮助信息。
测试
scale=n(n为整数),保留运算结果n位对加法减法乘法无效,可使替代用/1,
如:echo "scale=3;3.141592653*10/1" | bc
、
三、条件表达式
3.1 &&,||
&&:如果第一个命令执行成功,与操作符&&才会执行第二个命令
语法: command1 && command2 [&& command3 ...] 1.命令之间使用 && 连接,实现逻辑与的功能。 2.只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。 3.只要有一个命令返回假(命令返回值 $? == 1),后面的命令就不会被执
||:如果第一个命令执行失败,或操作符||才会执行第二个命令
command1 || command2 [|| command3 …] 1.命令之间使用 || 连接,实现逻辑或的功能。 2.只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。 3.只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。
3.2 文件判断
常用文件测试操作符
常用文件测试操作符 | 说明 |
---|---|
-d文件,d的全拼为directory | 文件存在且为目录则为真,即测试表达式成立 |
-f文件,f的全拼为file | 文件存在且为普通文件则为真,即测试表达式成立 |
-e文件,e的全拼为exist | 文件存在则为真,即测试表达式成立。注意区别于“-f”,-e不辨别是目录还是文件 |
-r文件,r的全拼为read | 文件存在且可读则为真,即测试表达式成立 |
-s文件,s的全拼为size | 文件存在且文件大小不为0则为真,即测试表达式成立 |
-w文件,w的全拼为write | 文件存在且可写则为真,即测试表达式成立 |
-x文件,x的全拼为executable | 文件存在且可执行则为真,即测试表达式成立 |
-L文件,L的全拼为link | 文件存在且为链接文件则为真,即测试表达式成立 |
fl -nt f2,nt 的全拼为 newer than | 文件fl比文件f2新则为真,即测试表达式成立。根据文件的修改时间来计算 |
fl -ot f2,ot 的全拼为 older than | 文件fl比文件f2旧则为真,即测试表达式成立。根据文件的修改时间来计算 |
判断目录是否存在
判断文件是否存在
3.3 字符串判断
字符串测试操作符
常用字符串测试操作符 | 说明 |
---|---|
-n "字符串" | 若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero |
-Z "字符串" | 若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写 |
"串 1"== "串 2" | 若字符串1等于字符串2,则为真,即测试表达式成立,可使用"=="代替"=" |
"串 1" != "串 2" | 若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!=="代替"!=" |
1.对于字符串的测试,一定要将字符串加双引号之后再进行比较。2.空格非空 |
例:
3.4 整数判断
整数二元比较操作符参考
在[]以及test中使用的比较符号 | 在(())和[[]]中使用的比较符号 | 说明 |
---|---|---|
-eq | ==或= | 相等,全拼为equal |
-ne | != | 不相等,全拼为not equal |
-gt | > | 大于,全拼为greater than |
-ge | >= | 大于等于,全拼为greater equal |
-lt | < | 小于,全拼为丨ess than |
-le | <= | 小于等于,全拼为less equal |
3.5 逻辑符号
&&:连接命令,如果第一个命令执行成功(返回0),与操作符&&才会执行第二个命令
[root@localhost demo03]# expr 1 == 1 && echo "相等" 1 相等 [root@localhost demo03]# expr 1 == 2 && echo "相等" 0 [root@localhost demo03]# expr 1 == 1 && echo "相等" 1
&&:[[]]使用,作为逻辑运算符,判断两个表达式是否都成立
[root@localhost demo03]# [[ 1 == 1 && 1 == 1 ]] [root@localhost demo03]# echo $? 0 [root@localhost demo03]# [[ 1 == 1 && 1 == 2 ]] [root@localhost demo03]# echo $? 1
常用逻辑操作符
在[]和test中使用的操作符 | 说明 | 在[[]]和中使用的操作符 | 说明 |
---|---|---|---|
-a | [ 条件A -a 条件B ]A与B都要成立,整个表达式才成立 | && | and,与,两端都为真,则结果为真 |
-o | [ 条件A -o 条件B]A与B都不成立,整个表达式才不成立 | || | or,或,两端有一个为真,则结果为真 |
! | ! | not,非,两端相反,则结果为真 |
相关文章:

Linux_Shell变量及运算符-05
一、Shell基础 1.1 什么是shell Shell脚本语言是实现Linux/UNIX系统管理及自W动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算…...

OpenCV图像滤波(13)均值迁移滤波函数pyrMeanShiftFiltering()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 函数执行均值迁移图像分割的初始步骤。 该函数实现了均值迁移分割的过滤阶段,即输出是经过滤波的“海报化”图像,其中颜色…...
用爬虫技术探索石墨文档:数据自动化处理与个性化应用的创新实践
用爬虫技术探索石墨文档:数据自动化处理与个性化应用的创新实践 在当今这个信息爆炸的时代,文档管理与协作成为了企业运营和个人工作中不可或缺的一部分。石墨文档,作为一款轻量级的云端Office套件,凭借其强大的在线协作、实时同…...

【JavaEE初阶】线程池
目录 📕 引言 🌳 概念 🍀ThreadPoolExecutor 类 🚩 int corePoolSize与int maximumPoolSize: 🚩 long keepAliveTime与TimeUnit nuit: 🚩 BlockingQueue workQueue:…...

zdpgo_cobra_req 新增解析请求体内容
zdpgo_cobra_req 使用Go语言开发的,类似于curl的HTTP客户端请求工具,用于便捷的测试各种HTTP地址 特性 1、帮助文档都是中文的2、支持常见的HTTP请求,比如GET、POST、PUT、DELETE等 下载 git clone https://github.com/zhangdapeng520/z…...

Java聚合快递对接云洋系统快递小程序源码
🌟【一键聚合,高效便捷】快递对接云洋系统小程序全攻略🚀 引言:告别繁琐,拥抱智能快递新时代🔍 在这个快节奏的时代,每一分每一秒都弥足珍贵。你是否还在为手动输入多个快递单号、频繁切换不同…...

陕西西安培华学院计算机软件工程毕业设计课题选题参考目录
陕西西安培华学院计算机软件工程毕业设计课题选题 博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,CSDN平台,✌️Java领域优质创作者,博客之星、掘金/华为云/阿里云等平台优质作者、专注于大学生项目实战开发…...
如何用sql在1分钟从1T数据中精准定位查询?Hive离线数仓 Spark分析
最近在一个群里,从群友哪里了解到这样一个业务需求:如何在 hdfs 1 T源数据库中,1分钟内从其中抓取自己想要的数据? 我的理解是 : 在hdfs数据库中为拥有 尽1T数据的表创建索引,并对其进行性能优化,以实现…...

acpi 主板布局需要 efi
今天在折腾 ESXI 的时候,启动虚拟机跳出了 acpi 主板布局需要 efi 然后我就将 ESXI 的启动方式改为了 EFI 但是虚拟机有莫名的启动不了,网上也没有找到办法,最后,我将虚拟机类型有原本的 ubuntu 换成了 debian 最后启动成功&…...

月之暗面对谈 Zilliz:长文本和 RAG 如何选择?
01 长文本与RAG通用对比 准确率:通常情况下长文本优于RAG 长文本:可更加综合的去分析所有相关的内容,提取相关数字,生成图表,效果尚可。RAG:更适合找到一段或者是几段可能相关的段落。如果希望大模型能够…...
高级java每日一道面试题-2024年8月12日-设计模式篇-请列举出在JDK中几个常用的设计模式?
如果有遗漏,评论区告诉我进行补充 面试官: 请列举出在JDK中几个常用的设计模式? 我回答: 在Java Development Kit (JDK) 中,许多设计模式被广泛使用,以帮助实现软件的结构、行为和复用。下面是一些在JDK中常见的设计模式及其简要说明: 工…...
mysql workbench8.0如何导出mysql5.7格式的sql定义
碰到的问题 mac上安装mysql workbech6.0后不能运行,但安装workbench8.0后,导出的数据库sql文件默认是msyql 8.0的语法和格式。比如生成索引的语句后面会有visible关键字,当把mysql8.0的sql文件导入到mysql5.7时就会报错。 如何解决 点击my…...

数据结构(学习)2024.8.6(顺序表)
今天开始学习数据结构的相关知识,大概分为了解数据结构、算法;学习线性表:顺序表、链表、栈、队列的相关知识和树:二叉树、遍历、创建,查询方法、排序方式等。 目录 一、数据结构 数据 逻辑结构 1.线性结构 2.树…...

MyBatis全解
目录 一, MyBatis 概述 1.1-介绍 MyBatis 的历史和发展 1.2-MyBatis 的特点和优势 1.3-MyBatis 与 JDBC 的对比 1.4-MyBatis 与其他 ORM 框架的对比 二, 快速入门 2.1-环境搭建 2.2-第一个 MyBatis 应用程序 2.3-配置文件详解 (mybatis-config.…...

【Redis进阶】Redis集群
目录 Redis集群的诞生 单节点Redis的局限性 1.存储容量限制 2.性能瓶颈 3.单点故障 4.扩展性能差 分布式系统发展的需要 1.海量数据处理 2.高性能要求 3.弹性扩展能力 Redis集群(cluster) 如图所示案例 Redis集群设计 什么是数据分片&…...

JVM运行时数据区之虚拟机栈
【1】概述 Java虚拟机栈(Java Virtual Machine Stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。 栈是运行…...

Python 机器学习求解 PDE 学习项目 基础知识(4)PyTorch 库函数使用详细案例
PyTorch 库函数使用详细案例 前言 在深度学习中,PyTorch 是一个广泛使用的开源机器学习库。它提供了强大的功能,用于构建、训练和评估深度学习模型。本文档将详细介绍如何使用以下 PyTorch 相关库函数,并提供相应的案例示例: to…...
SpringBoot-enjoy模板引擎
主要用于Web开发,前后端不分离时的页面渲染 SpringBoot整合enjoy模板引擎步骤: 1.将页面保存在templates目录下 2.添加enjoy的坐标 <dependency> <groupId>com.jfinal</groupId> <artifactId>enjoy</artifactId&g…...

【学习笔记】如何训练大模型
如何在许多 GPU 上训练真正的大型模型? 单个 GPU 工作线程的内存有限,并且许多大型模型的大小已经超出了单个 GPU 的范围。有几种并行范式可以跨多个 GPU 进行模型训练,还可以使用各种模型架构和内存节省设计来帮助训练超大型神经网络。 并…...

高可用集群KEEPALIVED
一、集群相关概念简述 HA是High Available缩写,是双机集群系统简称,指高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。 1、集群的分类 LB:负载均衡…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...