shell脚本中条件语句

一.test测试

在Shell脚本中,test命令用于进行条件测试。它也可以通过方括号[]来表示,因为test实际上是[命令的一个别名。

格式1:test  条件表达式
格式2:[  条件表达式  ]
注意[ ]空格,否则会失败
测试 是否成功使用 $?  返回值
[ 操作符 文件或目录 ]
help test

示例:

测试是否执行成功0为成功,其余为不成功

以下是一些常见的test条件测试知识点:

1.数值比较

1.-eq:等于 ,第一个数等于(Equal)第二个数

2.-ne:不等于,第一个数不等于(Not Equal)第二个数

3.-gt:大于,第一个数大于(Greater Than)第二个数

4.-lt:小于,第一个数小于(Lesser Than)第二个数

5.-ge:大于等于,第一个数小于或等于(Lesser or Equal)第二个数

6.-le:小于等于,第一个数大于或等于(Greater or Equal)第二个数

++      自身变量+1   
 --       自身变量-1    
+=5    自身变量+5   
-=5     自身变量-5
*=5     自身变量*5
/=5     自身变量/5
%=5   自身变量%5

示例:

2.字符串比较

1.=:等于,字符串内容相同

2.!=:不等于,字符串内容不同,! 号表示相反的意思

3.-z:长度为零,字符串内容为空

4.-n:长度不为零,字符是否存在

5.<:小于(在ASCII值中比较)

6.>:大于(在ASCII值中比较)

3.文件检查

1.-e:测试目录或文件是否存在(Exist)

2.-f:测试是否为文件(File)

3.-d:测试是否为目录(Directory)

4.-s:文件大小不为零,是否存在且非空

5.-r:测试当前用户是否有权限读取(Read)

6.-w:测试当前用户是否有权限写入(Write)

7.-x:测试当前用户是否有权限执行(eXcute)

8.-L: 测试是否为软连接文件

4.逻辑操作符

1.-a:逻辑与

2.-o:逻辑或

3.!:逻辑非

5.其他

1.-nt:比某个文件新

2.-ot:比某个文件旧

3.-ef:两个文件是同一个文件(通过inode号判断)

6.逻辑测试(短路运算)

格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...

格式2:命令1 操作符 命令2 ...

逻辑运算中的短路测试是指在进行逻辑运算时,如果能够确定整个表达式的值而无需计算所有部分,则可以提前停止计算,从而提高效率。在逻辑运算中,当使用逻辑与(&&)和逻辑或(||)操作符时,存在短路测试的情况。

  1. 逻辑与(&&)的短路测试

    • 如果第一个操作数为假(false),则整个表达式的结果必定为假,因此不会再计算第二个操作数,直接返回结果。
    • 只有当第一个操作数为真(true)时,才会计算第二个操作数,并返回整个表达式的结果。
  2. 逻辑或(||)的短路测试

    • 如果第一个操作数为真(true),则整个表达式的结果必定为真,因此不会再计算第二个操作数,直接返回结果。
    • 只有当第一个操作数为假(false)时,才会计算第二个操作数,并返回整个表达式的结果。

短路测试的应用可以提高代码的效率,特别是在条件语句中,可以根据短路测试的特性来优化代码。例如,在条件判断中,将不太可能发生的情况放在前面可以利用短路测试来减少不必要的计算。

示例:

// 短路测试示例
int a = 5;
int b = 0;
// 使用逻辑与(&&),如果a为假,则不会计算b的值
if (a != 0 && 10 / a > b) {System.out.println("条件成立");
} else {System.out.println("条件不成立");
}
// 使用逻辑或(||),如果a为真,则不会计算b的值
if (a == 0 || 10 / a > b) {System.out.println("条件成立");
} else {System.out.println("条件不成立");
}

在上述示例中,如果a为0,则不会进行除法运算,因为在逻辑与和逻辑或中,第一个操作数为假或者真时,不会再计算第二个操作数。

常见条件

  • -a或&&:逻辑与,“而且”的意思全真才为真

  • -o或||:逻辑或,“或者”的意思一真即为真

  • !:逻辑否

|| 只有前面不成立时才会执行后面的操作

7.双中括号

在Shell编程中,双中括号([[ ... ]])是一种用于条件测试的语法结构,通常用于if语句或while循环中。它相比于单中括号([ ... ])在功能上更加强大,支持更多的条件测试和比较操作,并且在语法上更加灵活。

[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
 注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
 注意: 此表达式用于[[  ]]中;扩展的正则表达式

8.()和{ }用法

在Shell编程中,(){} 是两种不同的语法结构,各自有着不同的用途和功能。

1.小括号()

  • 命令组合:小括号可以将一系列命令组合在一起,形成一个子shell。在子shell中执行的命令不会影响到当前shell的环境。

(cd /path/to/directory && ls)

  • 数组赋值:小括号也可以用来定义数组,并为数组赋值。

arr=(apple banana orange)

  • 算术扩展:小括号可以用于算术扩展,对其中的表达式进行算术运算。

result=$((3 + 5))

2.大括号{ }

  • 代码块:大括号可以用来创建代码块,在代码块中可以包含一系列命令,作为一个整体来执行。

{

echo "Hello"

echo "World"

}

  • 参数扩展:大括号可以用于参数扩展,对大括号中的内容进行扩展。

echo file{1..5}.txt # 输出:file1.txt file2.txt file3.txt file4.txt file5.txt

  • 函数定义:大括号也可以用于定义函数,函数体内的命令都将被视为函数的内容。

my_function() {

echo "This is a function"

}

  • 变量名扩展:大括号也可用于扩展变量名,通常用于避免歧义。

var="Hello"

echo "${var}World"

总的来说,小括号和大括号在Shell编程中有着不同的用途,能够提供一些方便的功能和语法结构,使得Shell脚本更加灵活和强大。

9.echo命令

echo -n   表示不换行输出
echo -e   表示输出转义符

选项作用
\r光标移至行首,并且不换行
\s当前shell的名称,如bash
\t插入Tab键,制表符
\n输出换行
\f换行,但光标仍停留在原处
\表示插入"\"本身转义
\b表示退格 不显示前一个字符
\c抑制更多的输出或不换行

10.date

date查看当前系统时间

-d 你描述的日期,显示指定字符串所描述的时间,而非当前时间

%F 完整日期格式,等价于 %Y-%m-%d

% T 时间(24小时制)(hh:mm:ss)

二.if语句的结构

1.if语句结构类型

(1)单支结构

程序执行到语句判断,进行判断,如果是就进行执行,否就直接结束

单分支
if 判断条件;
then   条件为真的分支代码
fi

(2)双支结构

程序执行到语句判断,进行判断,如果是就执行语句1,否就执行语句2.然后结束

双分支
if 判断条件; then条件为真的分支代码
else条件为假的分支代码
fi

(3)多支结构

多分支
if 判断条件1
then条件1为真的分支代码
elif 判断条件2
then条件2为真的分支代码
elif 判断条件3;then条件3为真的分支代码
...
else以上条件都为假的分支代码  托底
fi

2.if语句相关解析

  • if 后面是一个条件,它可以是命令的返回状态码、字符串比较、数值比较等等。在方括号 [ ] 中的条件可以是各种表达式,如 -f filename 表示判断文件是否存在、$var -eq 10 表示判断变量是否等于 10 等等。
  • then 关键字指示如果条件为真,则执行紧随其后的代码块。
  • elif 是 else if 的缩写,用于添加额外的条件检查。可以有零个或多个 elif 部分。
  • else 用于处理所有前面的条件都不满足的情况。它是可选的。
  • fi 是 if 的倒写,用于结束 if 结构。

3.多分支举例

成绩单

三.case语句

case 语句是一种在 Shell 脚本中用于多重条件判断的结构。它通常与 esac 一起使用,用于测试一个变量与多个模式之间的匹配情况

基本语法:

case 变量名 in模式1)命令序列1;;模式2)命令序列2;;...)命令序列...;;*)默认命令序列;;
esac
  • 变量名:要测试的变量名。
  • 模式1模式2 等:模式用于匹配变量的值。如果变量的值与某个模式匹配,则执行相应的命令序列。
  • 命令序列1命令序列2 等:与每个模式匹配时要执行的命令序列。
  • ;;:用于终止每个模式的命令序列。
  • *:通配符,用于匹配所有未被前面模式匹配的情况。
  • 默认命令序列:当变量值与所有模式都不匹配时要执行的命令序列。
  • ?:任意单个字符

四.循环语句

1.for循环语句

for 循环是一种在编程中常用的循环结构,用于重复执行一段代码直到满足特定条件为止

for循环由三个关键部分组成:

  1. 初始化(Initialization):在循环开始之前执行一次的语句,用于初始化循环变量或设置起始条件。
  2. 循环条件(Condition):在每次循环迭代之前被检查的条件。如果条件为真,则继续执行循环体;如果条件为假,则退出循环。
  3. 迭代(Iteration):在每次循环结束后执行的语句,用于更新循环变量的值。

语法结构类型

(1)列表循环

(2)不带列表循环

(3)类C风格的for循环

for 循环的基本工作流程如下:

  1. 执行初始化部分。
  2. 检查循环条件。如果条件为真,则执行循环体;如果条件为假,则退出循环。
  3. 执行循环体。
  4. 执行迭代部分。
  5. 返回步骤 2,重复以上过程,直到循环条件为假为止。

for 循环通常用于需要固定次数的迭代,或者在已知起始点和结束点的情况下。然而,它也可以用于迭代数组、集合等数据结构中的元素。

示例

(1)由1加到100的总和

(2)批量添加用户

#!/bin/bash
uname=20
for ((i=1; i<=uname; i++))
douseradd $iecho "123" |passwd --stdin  $i &>/dev/null
done

2.while循环

while 循环是编程中常用的一种循环结构,它在指定条件为真(true)时重复执行代码块。

while循环通常的语法

while condition:# 在条件为真时执行的代码块

在这个语法中,condition 是一个表达式,当它的值为真时,循环中的代码块会被执行。每次执行完代码块后,条件会再次被检查,如果条件仍然为真,循环将继续执行;直到条件变为假(false)时,循环停止。

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

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

相关文章

每天认识新职业——网络工程师

一、网络工程师是什么 网络工程师是通过学习和训练&#xff0c;掌握网络技术的理论知识和操作技能的网络技术人员。网络工程师能够从事计算机信息系统的设计、建设、运行和维护工作。相关职业&#xff1a;系统集成工程师、计算机硬件工程师职业其他名称&#xff1a;网络管理员、…

【码农日常】将mp4转换为逐帧图片

项目场景&#xff1a; 拍摄了一段视频记录设备工作的状态和测量仪器的实时数据。由于测量仪器岁数比较大&#xff0c;不够智能&#xff0c;遂打算将视频转换为逐帧图片进行分析。 网上没找到现成工具&#xff0c;借鉴网上大神的操作方式打算用python写一个工具。 问题描述 用…

Unity射击游戏开发教程:(15)添加推进器推进和推进器推进动画

这是一个可以添加到我的游戏中的简单而有趣的功能。当玩家按住 Shift 按钮时,速度会加快,松开 Shift 按钮时,速度会恢复到原来的速度。 这需要不同的输入检测。通常使用的是Input.GetKeyDown并传入你想要获取的key。这只会检测在当前帧期间是否按下了按钮,但如果按住,将不…

学习Uni-app开发小程序Day10

前面学习了局部组件的创建和简单使用&#xff0c;今天学习了slot&#xff08;插槽&#xff09;和组件之间的传值1. 插槽的使用 在components中&#xff0c;创建一个组件&#xff0c;给组件设置头部布局、内容布局、底部布局&#xff0c;例如&#xff1a; <template><…

括号匹配(栈)

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; c有栈 但是C语言没有 到那时我们可以自己造 这里的代码是直接调用栈&#xff0c;然后调用 等于三个左括号的任意一个 我们就入栈 左括号&#xff08;入栈&#xff09; 右括号 取出栈顶数据&#xff0c;出栈并且进行匹配…

力扣【旋转函数】python

如果直接用暴力的话&#xff0c;只能过4个样例好像&#xff0c;超时 因此得用递推公式 F1F0前n-1个数-(n-1)*第n个数 F0sum(nums)-n*第n个数 nlen(nums) ans[]#定义一个存最大值值的列表 ss sum(nums) dm 0 for j in range(n):dm j * nums[j] ans.append(dm) print(dm) n…

树莓派对FPGA板子上的流水灯程序的控制

文章目录 一 树莓派使用教程二 树莓派串口代码三 Verilog代码四 quartus引脚绑定五 运行效果总结 分别在DE2-115开发板和树莓派上编写串口通信程序&#xff0c; 实现树莓派串口指令对FPGA板子上的流水灯程序的控制&#xff0c;控制方式自定。 一 树莓派使用教程 参考&#xff…

重发布与路由决策

单点重发布 将A协议--->B协议 [r2-rip-1]import-route ospf 1 将静态---->B协议 [r2-rip-1]import-route static 将直连---->B协议 [r2-rip-1]import-route direct 双点重发布 路由回馈&#xff1a;指的是从某协议传出的路由信息又被传回该协议中。可以引起选路…

python数据分析——seaborn绘图1

参考资料&#xff1a;活用pandas库 matplotlib库是python的和兴绘图工具&#xff0c;而seaborn基于matplotlib创建&#xff0c;它为绘制统计图提供了更高级的接口&#xff0c;使得只用少量代码就能生成更美观、更复杂的可视化效果。 seaborn库和pandas以及其他pydata库&#xf…

第十五节:贪心算法(下)

一 、 贪心算法的解题套路实战一&#xff08;最多的会议宣讲场次&#xff09; 1.1 描述 一些项目要占用一个会议室宣讲&#xff0c;会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间 你来安排宣讲的日程&#xff0c;要求会议室进行的宣讲的场次最多。…

vue:网页icon无法显示

logo文件放在public文件夹下&#xff0c;在html里设置icon。 本地源码运行后发现网页icon无法显示我们设置的logo&#xff0c;而是显示了浏览器默认icon。 这个问题不需要解决&#xff0c;部署后网页icon显示就正常了。

通过ip addr命令无法获取到ip地址,无法ping通百度

问题 今天通过VM安装CentOS虚拟机时&#xff0c;安装完成后&#xff0c;想查看ip地址&#xff0c;使用ip addr命令&#xff0c;发现没有展示网络ip地址&#xff0c;ping百度也不通。 解决方案 CentOS使用网络配置文件来设置网络接口的参数&#xff0c;出现这个问题说明网络的…