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 命令时,它会跳过剩余的命令

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

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

相关文章

JAVA中的泛型机制详解

1.泛型的概念 java泛型是java5引入的一个特性&#xff0c;它允许我们为类&#xff0c;接口&#xff0c;方法指定类型参数&#xff0c;从而提供编译时类型安全检查。泛型的本质是参数化类型&#xff0c;即在声明类&#xff0c;接口或者方法时不指定具体的类型&#xff0c;而是使…

openEuler 安装 ROS2 Humble

openEuler 安装 ROS2 Humble 1 介绍2 安装【openEuler 24.03】2.1 Installing ros-humble2.2 Test ros-humble【python 版本冲突&#xff0c;未解决】 2 安装【openEuler 22.03】3 Python 版本问题【pyenv】参考 1 介绍 2 安装【openEuler 24.03】 2.1 Installing ros-humble…

FastApi接口限流

有个接口内容信息比较敏感&#xff0c;遂设置限流操作 通常的限流操作就包括对某个用户或者某个IP进行限流&#xff0c;每分钟或者每天最多能访问多少次之类的等等。FaslApi中的限流操作开源库SlowApi https://github.com/laurentS/slowapi 这个库是根据flask-limiter改编而来&…

力扣高频SQL 50题(基础版)第十三题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第十三题570. 至少有5名直接下属的经理题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题&#xff08;基础版&#xff09;第十三题 570. 至少有5名直接下属的经理 题目说明 表: Employee ------…

Java面试八股之后Spring、spring mvc和spring boot的区别

Spring、spring mvc和spring boot的区别 Spring, Spring Boot和Spring MVC都是Spring框架家族的一部分&#xff0c;它们各自有其特定的用途和优势。下面是它们之间的主要区别&#xff1a; Spring: Spring 是一个开源的轻量级Java开发框架&#xff0c;最初由Rod Johnson创建&…

MySQL零散拾遗(七)--- 突发奇想的一些疑虑

mysql中从2018-12-18提取出2018-12&#xff0c;如何实现 要在MySQL中从日期2018-12-18提取出2018-12&#xff0c;可以使用DATE_FORMAT()函数或者EXTRACT()函数。这两种方法都可以达到目的&#xff0c;下面是具体的实现方式&#xff1a; 使用 DATE_FORMAT() DATE_FORMAT()函数…

Ubuntu 20.04.5 LTS 编译 Android T(qcm8550 or rk3588)环境配置

Ubuntu 20.04.5 LTS 编译 Android T(qcm8550 or rk3588)环境配置&#xff1a; 参考文档&#xff1a; https://source.android.google.cn/docs/setup/start?hlzh-cn Android系统开发指导 https://developer.android.google.cn/studio/run/device?hlru USB 调试配置 https://b…

Linux之存储桶minio单机安装和使用简介

一、minio简介 MinIO 是一个高性能的分布式对象存储系统&#xff0c;主要用于存储非结构化数据&#xff0c;例如照片、视频、备份和日志文件。它是开源的&#xff0c;基于 Go 语言开发&#xff0c;具有高度可扩展性和高可用性&#xff0c;能够在私有云、公有云和边缘环境中部署…

20240725项目的maven环境报红-重新配置maven

1.在编辑器里面打开项目&#xff0c;导入源码 &#xff08;1&#xff09;找到项目的地址C:\Users\zzz\IdeaProjects\datasys&#xff0c;然后右击用idea编辑器打开。 &#xff08;2&#xff09;idea中上菜单栏打开open&#xff0c;然后输入file&#xff0c;选择源代码文件 2.…

LabVIEW放大器自动测量系统

开发了一个基于LabVIEW平台的多路前置放大器自动测量系统的开发与实施。该系统集成了硬件控制与软件编程&#xff0c;能够实现放大器各项性能指标的快速自动测量&#xff0c;有效提高了测试的精确性和效率。系统设计采用了虚拟仪器技术&#xff0c;结合了先进的测量与控制策略&…

.net core 外观者设计模式 实现,多种支付选择

1&#xff0c;接口 /// <summary>/// Web页面支付/// </summary>public interface IWebPagePay{public WebPagePayResult CreatePay(string productName, string orderSn, string totalPrice);}2&#xff0c;实现接口 实现阿里支付 public class AliPagePay : IWe…

Linux的TERM环境变量

程序或者脚本驱动登录到Linux系统之后。执行命令或者脚本&#xff0c;其返回值中往往出现格式异常。原因则在于虚拟终端类型的高级特性&#xff0c;例如&#xff1a;“颜色、高亮、移动光标”等。那么&#xff0c;是否禁掉这些高级特性呢&#xff1f;可以选择dumb类型&#xff…

丹东纵横文化传媒:创新引领,广告服务再升级

近日,丹东市振兴区的丹东纵横文化传媒有限公司再次传来振奋人心的消息,这家以互联网和相关服务为主的新兴企业,在广告设计与传播领域实现了重大突破,进一步巩固了其在行业内的领先地位。 【广告服务全面升级,引领市场新风尚】 据丹东纵横文化传媒有限公司最新发布的信息显示,公…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX&#xff1f;****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战&#xff1a;创建一个动态表单****8. AJAX中的事…

spine to unity-2.利用边缘框实现实时碰撞检测

主要讲spine的边缘框&#xff0c;在unity中&#xff0c;实现实时碰撞检测。其中使用的素材&#xff0c;是我为独立游戏ink制作的动画。独立游戏ink的开发日志&#xff0c;在小红薯持续更新中。spine工具包的安装&#xff0c;下载请参考spine to unity-1spine BoundingBoxFollow…

Doris全方位教程+应用实例

Impala性能稍领先于presto,但是presto在数据源支持上非常丰富&#xff0c;包括hive、图数据库、传统关系型数据库、Redis等 缺点&#xff1a;这两种对hbase支持的都不好&#xff0c;presto 不支持&#xff0c;但是对hdfs、hive兼容性很好&#xff0c;其实这也是顺理成章的&…

mac怎样清理photoshop垃圾的方法 ps清理缓存和垃圾 苹果电脑暂存盘已满怎么清理

很多使用过ps&#xff0c;尤其是Adobe全家桶的小伙伴会发现&#xff0c;这些软件占用缓存很多&#xff0c;而且随着使用时间的增长&#xff0c;缓存也会越多&#xff0c;并不会自动清理。那么mac系统怎么清理ps暂存盘呢&#xff1f;mac又该怎么最高效清理磁盘空间呢&#xff1f…

Linux嵌入书学习—数据结构——栈(seqstak)

一、栈&#xff1b; 定义&#xff1a; 是限定仅在表尾&#xff08;栈顶&#xff09;进行插入和删除操作的线性表 栈又称为 后进先出&#xff08;Last In First Out&#xff09; 的线性表&#xff0c;简称 LIFO 结构 栈顶&#xff08;Top&#xff09; 栈顶是栈中允许进行添加&…

RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习_2_登录

文章目录 一、登录1.生成验证码2.验证码作用1.大体流程2.代码层面(我们都是从前端开始看起) 一、登录 1.生成验证码 基本思路&#xff1a; 后端生成一个表达式&#xff0c;例如34?7,显而易见后面是答案截取出来题干和答案把题干11&#xff1f;变成图片&#xff0c;变成流&a…

[C++进阶]多态的概念、定义与实现

多态&#xff0c;顾名思义&#xff0c;即多种形态。具体来说&#xff0c;就是不同对象执行同一行为而产生不同的结果。 一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生…