linux shell(中)
结构化命令
if语句
if-then
最基本的结构化命令是 if-then 语句。if-then 语句的格式如下:
if command thencommands ifif command; then # 通过把分号(;)放在待求值的命令尾部,可以将 then 语句写在同一行commands if
bash shell 的 if 语句会运行 if 之后的命令。如果该命令的退出状态码(参见第 11 章)为 0(命令成功运行),那么位于 then 部分的命令就会被执行。如果该命令的退出状态码是其他值,则 then 部分的命令不会被执行,bash shell 会接着处理脚本中的下一条命令。fi 语句用来表示if-then 语句到此结束。
#!/bin/bash # testing the if statement if pwd # if 行中的 pwd 命令,由于退出状态码是 0,会执行if-then 内部的语句 thenecho 'heheh' if
#!/bin/bash # testing an incorrect command if IamNotCommand # if 行中的 IamNotCommand 命令,由于命令不存在,不会执行if-then 内部的语句 thenecho 'heheh' if
if-then-else
if-then-else 语句在语句中提供了另外一组命令
if command thencommands elsecommands if
#!/bin/bash # testing the else section # testuser=NoSuchUser # if grep $testuser /etc/passwd thenecho "The script files in the home directory of $testuser are:"ls /home/$testuser/*.shecho elseecho "The user $testuser does not exist on this system."echo fi echo "We are outside the if statement"
elif 语句行提供了另一个要测试的命令,这类似于原始的 if 语句行。
if command1 then commands elif command2 thenmore commands fi
test命令
test 命令可以在 if-then 语句中测试不同的条件。如果 test 命令中列出的条件成立,那么test 命令就会退出并返回退出状态码 0。如果条件不成立,那么 test 命令就会退出并返回非 0 的状态码,这使得 if-then 语句不会再被执行。
test 命令的格式非常简单:
test condition if test condition thencommands fi
如果不写 test 命令的 condition 部分,则它会以非 0 的退出状态码退出。
使用 test 命令确定变量中是否为空:
#!/bin/bash # testing if a variable has content # my_variable="Full" # if test $my_variable # my_variable不是空,返回状态0 thenecho "The my_variable variable has content and returns a True."echo "The my_variable variable content is: $my_variable" elseecho "The my_variable variable doesn't have content,"echo "and returns a False." fi
bash shell 提供了另一种条件测试方式,无须在 if-then 语句中写明 test 命令:
if [ condition ] then commands fi
方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须留有空格,否则就会报错。
test 命令和测试条件可以判断 3 类条件:
-
数值比较(注意:不支持浮点数,只能用于整数)
-
字符串比较
-
文件比较
数值比较
比较 | 描述 |
---|---|
n1 -eq n2 | 检查 n1 是否等于 n2 |
n1 -ge n2 | 检查 n1 是否大于或等于 n2 |
n1 -gt n2 | 检查 n1 是否大于 n2 |
n1 -le n2 | 检查 n1 是否小于或等于 n2 |
n1 -lt n2 | 检查 n1 是否小于 n2 |
n1 -ne n2 | 检查 n1 是否不等于 n2 |
#!/bin/bash # Using numeric test evaluations # value1=10 value2=11 # if [ $value1 -gt 5 ] thenecho "The test value $value1 is greater than 5." fi # if [ $value1 -eq $value2 ] thenecho "The values are equal." elseecho "The values are different." fi
字符串比较
比较 | 描述 |
---|---|
str1 = str2 | 检查 str1 是否和 str2 相同 |
str1 > str2 | 检查 str1 是否大于 str2 |
str1 < str2 | 检查 str1 是否小于 str2 |
str1 != str2 | 检查 str1 是否和 str2 不同 |
-n str1 | 检查 str1 的长度是否不为 0 |
-z str1 | 检查 str1 的长度是否为 0 |
#!/bin/bash # Using string test evaluations # testuser=christine # if [ $testuser = christine ] thenecho "The testuser variable contains: christine" elseecho "The testuser variable contains: $testuser" fi
文件比较
比较 | 描述 |
---|---|
-d file | 检查 file 是否存在且为目录 |
-e file | 检查 file 是否存在 |
-f file | 检查 file 是否存在且为文件 |
-r file | 检查 file 是否存在且可读 |
-s file | 检查 file 是否存在且非空 |
-w file | 检查 file 是否存在且可写 |
-x file | 检查 file 是否存在且可执行 |
-O file | 检查 file 是否存在且属当前用户所有 |
-G file | 检查 file 是否存在且默认组与当前用户相同 |
file1 -nt file2 | 检查 file1 是否比 file2 新 |
file1 -ot file2 | 检查 file1 是否比 file2 旧 |
#!/bin/bash # 检查目录 # jump_directory=/home/Torfa # if [ -d $jump_directory ] thenecho "The $jump_directory directory exists."cd $jump_directoryls elseecho "The $jump_directory directory does NOT exist." fi
if-then的高级特性
-
在子 shell 中执行命令的单括号
-
用于数学表达式的双括号
-
用于高级字符串处理功能的双方括号
单括号
单括号允许在 if 语句中使用子 shell。单括号形式的 test 命令格式如下:
(command)
在 bash shell 执行 command 之前,会先创建一个子 shell,然后在其中执行命令。如果命令成功结束,则退出状态码会被设为 0,then 部分的命令就会被执行。
#!/bin/bash # Testing a single parentheses condition # echo $BASH_SUBSHELL # if (echo $BASH_SUBSHELL) thenecho "The subshell command operated successfully." # elseecho "The subshell command was NOT successful." # fi
当脚本第一次(在 if 语句之前)执行 echo $BASH_SUBSHELL 命令时,是在当前 shell 中完成的。该命令会输出 0,表明没有使用子 shell($BASH_SUBSHELL :当前子 shell 环境的嵌套级别(初始值是 0))。在if 语句内,脚本在子 shell 中执行 echo $BASH_SUBSHELL 命令,该命令会输出 1,表明使用了子 shell。子 shell 操作成功结束,接下来是执行 then 部分的命令
双括号
双括号命令允许在比较过程中使用高级数学表达式。
符号 | 描述 |
---|---|
val++ | 后增 |
val– | 后减 |
++val | 先增 |
–val | 先减 |
! | 逻辑求反 |
- | 位求反 |
** | 幂运算 |
<< | 左位移 |
>> | 右位移 |
& | 位布尔 AND |
&& | 逻辑 AND |
| | 逻辑OR |
#!/bin/bash # Testing a double parentheses command # val1=10 # if (( $val1 ** 2 > 90 )) then(( val2 = $val1 ** 2 ))echo "The square of $val1 is $val2,"echo "which is greater than 90." # fi
双方括号
双方括号命令提供了针对字符串比较的高级特性。双方括号的格式如下:
[[ expression ]]
expression 可以使用 test 命令中的标准字符串比较。除此之外,它还提供了 test 命令所不具备的另一个特性——模式匹配。
在进行模式匹配时,可以定义通配符或正则表达式
#!/bin/bash # Using double brackets for pattern matching # # if [[ $BASH_VERSION == 5.* ]] thenecho "You are using the Bash Shell version 5 series." fi # 上述脚本中使用了双等号(==)。双等号会将右侧的字符串(5.*)视为一个模式并应用模式匹配规则。 # 双方括号命令会对$BASH_VERSION 环境变量进行匹配,看是否以字符串 5.起始。 # 如果是,则测试通过,shell 会执行 then 部分的命令。
Case命令
有了 case 命令,无须再写大量的 elif 语句来检查同一个变量的值了。case 命令会采用列表格式来检查变量的多个值:
case variable in pattern1 | pattern2) commands1;; pattern3) commands2;; *) default commands;; esac
#!/bin/bash # Using a short case statement # case $USER in rich | christine)echo "Welcome $USER"echo "Please enjoy your visit.";; barbara | tim)echo "Hi there, $USER"echo "We're glad you could join us.";; testing)echo "Please log out when done with test.";; *)echo "Sorry, you are not allowed here." esac $
循环
for
bash shell 提供了 for 命令,以允许创建遍历一系列值的循环。每次迭代都使用其中一个值来执行已定义好的一组命令。for 命令的基本格式如下:
for var in list docommands done
#!/bin/bash # basic for command 读取列表中的值 for test in Alabama Alaska Arizona Arkansas California Colorado doecho The next state is $test done
for 命令使用空格来划分列表中的每个值。如果某个值含有空格,则必须将其放入双引号内
#!/bin/bash # an example of how to properly define values for test in Nevada "New Hampshire" "New Mexico" "New York" doecho "Now going to $test" done
可以从变量中读取列表
#!/bin/bash # using a variable to hold the list list="Alabama Alaska Arizona Arkansas Colorado" list=$list" Connecticut" for state in $list # doecho "Have you ever visited $state?" done
$list 变量包含了用于迭代的值列表。注意,脚本中还使用了另一个赋值语句向$list 变量包含的值列表中追加(或者说是拼接)了一项。这是向变量中已有的字符串尾部添加文本的一种常用方法。
从命令中读取值列表
#!/bin/bash # reading values from a file file="states.txt" for state in $(cat $file) doecho "Visit beautiful $state" done
使用 cat 命令来输出文件 states.txt 的内容,states.txt 文件中每
个值各占一行,而不是以空格分隔。
更改字段分割符
IFS环境变量定义了 bash shell 用作字段分隔符的一系列字符。在默认情况下,bash shell 会将下列字
符视为字段分隔符:
-
空格
-
制表符
-
换行符
如果 bash shell 在数据中看到了这些字符中的任意一个,那么它就会认为这是列表中的一个新字段的开始。
可以在 shell 脚本中临时更改 IFS 环境变量的值,指定字段分隔符的字符。
#!/bin/bash # reading values from a file file="states.txt"IFS.OLD=$IFS IFS=$'\n' # 告诉 bash shell 忽略数据中的空格和制表符 for state in $(cat $file) doecho "Visit beautiful $state" done IFS=$IFS.OLD # 恢复默认值,保证后续使用默认值的操作能正常运行# IFS=: # 如果要遍历文件中以冒号分隔的值,则只需将 IFS 的值设为冒号即可# IFS=$'\n:;"' # 将换行符、冒号、分号和双引号作为字段分隔符
使用通配符读取目录
#!/bin/bash # iterate through all the files in a directory for file in /home/rich/test/* doif [ -d "$file" ]thenecho "$file is a directory"elif [ -f "$file" ]thenecho "$file is a file"fi done
#!/bin/bash # 可以在 for 命令中列出多个目录通配符 for file in /home/rich/.b* /home/rich/badtest doif [ -d "$file" ]thenecho "$file is a directory"elif [ -f "$file" ]thenecho "$file is a file"elseecho "$file doesn't exist"fi done
C 语言风格的 for 命令
bash 中仿 C 语言的 for 循环的基本格式如下:
for (( variable assignment ; condition ; iteration process ))# demo for (( a = 1; a < 10; a++ ))
注意,有些地方与 bash shell 标准的 for 命令并不一致:
-
变量赋值可以有空格
-
迭代条件中的变量不以美元符号开头
-
迭代过程的算式不使用 expr 命令格式
#!/bin/bash # testing the C-style for loopfor (( i=1; i <= 10; i++ )) doecho "The next number is $i" done
仿 C 语言的 for 命令也允许为迭代使用多个变量
#!/bin/bash # multiple variables for (( a=1, b=10; a <= 10; a++, b-- )) doecho "$a - $b" done
while
while 命令在某种程度上糅合了 if-then 语句和 for 循环。while 命令的格式如下:
while test command doother commands done
while 命令中定义的 test command 与 if-then 语句中的格式一模一样。可以使用任何 bash shell 命令,或者用 test command 进行条件测试。
while 命令的关键在于所指定的 test command 的退出状态码必须随着循环中执行的命令而改变。如果退出状态码不发生变化,那 while 循环就成了死循环。
#!/bin/bash # while command test var1=10 while [ $var1 -gt 0 ] doecho $var1var1=$[ $var1 - 1 ] done
while 命令允许在 while 语句行定义多个测试命令。只有最后一个测试命令的退出状态码会被用于决定是否结束循环。
#!/bin/bash # testing a multicommand while loop var1=10 while echo $var1[ $var1 -ge 0 ] doecho "This is inside the loop"var1=$[ $var1 - 1 ] done
until
与 while 命令工作的方式完全相反,until 命令要求指定一个返回非 0 退出状态码的测试命令。只要测试命令的退出状态码不为 0,bash shell 就会执行循环中列出的命令。一旦测试命令返回了退出状态码 0,循环就结束了。
until test command doother commands done
循环控制
breadk
break 命令是退出循环的一种简单方法。你可以用 break 命令退出任意类型的循环,包括while 循环和 until 循环。
#!/bin/bash # breaking out of a for loop for var1 in 1 2 3 4 5 6 7 8 9 10 doif [ $var1 -eq 5 ]thenbreakfiecho "Iteration number: $var1" done echo "The for loop is completed"
在处理多个循环时,break 命令会自动结束你所在的最内层循环:
#!/bin/bash # breaking out of an inner loop for (( a = 1; a < 4; a++ )) doecho "Outer loop: $a"for (( b = 1; b < 100; b++ ))doif [ $b -eq 5 ]thenbreak # 结束内层循环fiecho " Inner loop: $b"done done
有时你位于内层循环,但需要结束外层循环。break 命令接受单个命令行参数:
break n
其中 n 指定了要跳出的循环层级。在默认情况下,n 为 1,表明跳出的是当前循环。如果将 n 设为 2,那么 break 命令就会停止下一级的外层循环:
#!/bin/bash # breaking out of an outer loop for (( a = 1; a < 4; a++ )) doecho "Outer loop: $a"for (( b = 1; b < 100; b++ ))doif [ $b -gt 4 ]thenbreak 2 # 结束外层循环fiecho " Inner loop: $b"done done
continue
continue 命令可以提前中止某次循环,但不会结束整个循环。你可以在循环内部设置 shell不执行命令的条件。
#!/bin/bash # using the continue command for (( var1 = 1; var1 < 15; var1++ )) doif [ $var1 -gt 5 ] && [ $var1 -lt 10 ]thencontinuefiecho "Iteration number: $var1" done
也可以在 while 循环和 until 循环中使用 continue 命令,但要特别小心。记住,当 shell执行 continue 命令时,它会跳过剩余的命令
相关文章:
linux shell(中)
结构化命令 if语句 if-then 最基本的结构化命令是 if-then 语句。if-then 语句的格式如下: if command thencommands ifif command; then # 通过把分号(;)放在待求值的命令尾部,可以将 then 语句写在同一行commands ifbash sh…...

VMware三种网络模式---巨细
文章目录 目录 ‘一.网络模式概述 二.桥接模式 二.NAT模式 三.仅主机模式 四.案例演示 防火墙配置: 虚拟电脑配置 前言 本文主要介绍VMware的三种网络模式 ‘一.网络模式概述 VMware中分为三种网络模式: 桥接模式:默认与宿主机VMnet0绑…...

力扣高频SQL 50 题(基础版)第一题
文章目录 力扣高频SQL 50 题(基础版)第一题1757.可回收且低脂的产品题目说明思路分析实现过程准备数据:实现方式:结果截图: 力扣高频SQL 50 题(基础版)第一题 1757.可回收且低脂的产品 题目说…...

2.1.卷积层
卷积 用MLP处理图片的问题:假设一张图片有12M像素,那么RGB图片就有36M元素,使用大小为100的单隐藏层,模型有3.6B元素,这个数量非常大。 识别模式的两个原则: 平移不变性(translation inva…...

网易《永劫无间》手游上线,掀起游戏界狂潮
原标题:网易《永劫无间》手游上线,网友:发烧严重 易采游戏网7月26日消息:自网易宣布《永劫无间》手游即将上线以来,广大游戏玩家的期待值就不断攀升。作为一款拥有丰富内容和极高自由度的游戏,《永劫无间》…...

RNN(一)——循环神经网络的实现
文章目录 一、循环神经网络RNN1.RNN是什么2.RNN的语言模型3.RNN的结构形式 二、完整代码三、代码解读1.参数return_sequences2.调参过程 一、循环神经网络RNN 1.RNN是什么 循环神经网络RNN主要体现在上下文对理解的重要性,他比传统的神经网络(传统的神…...
php 根据位置的经纬度计算距离
在开发中,我们要经常和位置打交道,要计算附近的位置、距离什么的。如下: 一.sql语句 SELECT houseID,title,location,chamber,room,toward,area,rent,is_verify,look_type,look_time, traffic,block_name,images,tag,create_time,update_time, location->&g…...

17 Python常用内置函数——基本输入输出
input() 和 print() 是 Python 的基本输入输出函数,前者用来接收用户的键盘输入,后者用来把数据以指定的格式输出到标准控制台或指定的文件对象。无论用户输入什么内容,input() 一律作为字符串对待,必要时可以使用内置函数 int()、…...

【Web】LitCTF 2024 题解(全)
目录 浏览器也能套娃? 一个....池子? 高亮主题(划掉)背景查看器 百万美元的诱惑 SAS - Serializing Authentication exx 浏览器也能套娃? 随便试一试,一眼ssrf file:///flag直接读本地文件 一个....池子? {…...

家政项目小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,家政人员管理,家政服务管理,咨询信息管理,咨询服务管理,家政预约管理,留言板管理,系统管理 微信端账号功能…...

electron TodoList网页应用打包成linux deb、AppImage应用
这里用的是windows的wsl的ubuntu环境 electron应用打包linux应用需要linux下打包,这里用windows的wsl的ubuntu环境进行操作 1)linux ubuntu安装nodejs、electron 安装nodejs: sudo apt update sudo apt upgrade ##快捷安装 curl -fsSL http…...

【C语言】 使用fgets和fputs完成两个文件的拷贝
目录 1、使用fgets和fputs完成两个文件的拷贝 2、使用fgets统计给定文件的行号 fgets和fputs的使用方法函数原型:int fputs(const char *s,FILE *stream); char *fgets(char *s,int size,FILE *stream);fupts…...

使用PyTorch导出JIT模型:C++ API与libtorch实战
PyTorch导出JIT模型并用C API libtorch调用 本文将介绍如何将一个 PyTorch 模型导出为 JIT 模型并用 PyTorch 的 CAPI libtorch运行这个模型。 Step1:导出模型 首先我们进行第一步,用 Python API 来导出模型,由于本文的重点是在后面的部署…...

Python——异常捕获,传递及其抛出操作
01. 异常的概念 1. 程序在运行时,如果 python解释器遇到一个错误,会停止程序的执行,并且提示一些错误信息,这就是异常。 2. 程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise…...
【Maven】 的继承机制
Maven是一个强大的项目管理工具,主要用于Java项目的构建和管理。它以其项目对象模型(POM)为基础,允许开发者定义项目的依赖、构建过程和插件。Maven的继承机制是其核心特性之一,它允许子项目继承和复用父项目的配置&am…...
微信小程序结合后端php发送模版消息
前端: <view class"container"><button bindtap"requestSubscribeMessage">订阅消息</button> </view> // index.js Page({data: {tmplIds: [UTgCUfsjHVESf5FjOzls0I9i_FVS1N620G2VQCg1LZ0] // 使用你的模板ID},requ…...
sqlalchemy报错sqlalchemy.orm.exc.DetachedInstanceError
解决方案: 在初始化数据库的代码中,将 maker sessionmaker(bindeng)修改为 maker sessionmaker(bindeng, expire_on_commitFalse)为什么要添加 expire_on_commitFalse 参数? expire_on_commit 可以用来更改 SQLAlchemy 的对象刷新机制&…...

华为网络模拟器eNSP安装部署教程
eNSP是图形化网络仿真平台,该平台通过对真实网络设备的仿真模拟,帮助广大ICT从业者和客户快速熟悉华为数通系列产品,了解并掌握相关产品的操作和配置、提升对企业ICT网络的规划、建设、运维能力,从而帮助企业构建更高效࿰…...

【React】详解样式控制:从基础到进阶应用的全面指南
文章目录 一、内联样式1. 什么是内联样式?2. 内联样式的定义3. 基本示例4. 动态内联样式 二、CSS模块1. 什么是CSS模块?2. CSS模块的定义3. 基本示例4. 动态应用样式 三、CSS-in-JS1. 什么是CSS-in-JS?2. styled-components的定义3. 基本示例…...

【ROS2】高级:安全-理解安全密钥库
目标:探索位于 ROS 2 安全密钥库中的文件。 教程级别:高级 时间:15 分钟 内容 背景安全工件位置 公钥材料 私钥材料域治理政策 安全飞地 参加测验! 背景 在继续之前,请确保您已完成设置安全教程。 sros2 包可以用来创…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...