shell编程-数组与运算符详解(超详细)
文章目录
- 前言
- 一、 Shell数组
- 1. 声明和初始化数组
- 2. 访问数组元素
- 3. 数组长度
- 4. 遍历数组
- 5. 修改数组元素
- 6. 删除数组元素
- 7. 示例
- 二、Shell运算符
- 1. 算术运算符
- 1.1 加法运算符 (`+`)
- 1.2 减法运算符 (`-`)
- 1.3 乘法运算符 (`*`)
- 1.4 除法运算符 (`/`)
- 1.5 取余运算符 (`%`)
- 2. 关系运算符
- 2.1 相等运算符 (`==`)
- 2.2 不相等运算符 (`!=`)
- 2.3 大于运算符 (`>`)
- 2.4 小于运算符 (`<`)
- 2.5 大于等于运算符 (`>=`)
- 2.6 小于等于运算符 (`<=`)
- 3. 逻辑运算符
- 3.1 逻辑与运算符 (`&&`)
- 3.2 逻辑或运算符 (`||`)
- 3.3 逻辑非运算符 (`!`)
- 4. 字符串运算符
- 4.1 相等运算符 (`==`)
- 4.2 不相等运算符 (`!=`)
- 4.3 字符串为空运算符 (`-z`)
- 4.4 字符串不为空运算符 (`-n`)
- 三、文件测试运算符
- 1. 检查文件类型
- 1.1 检查是否为普通文件 (`-f`)
- 1.2 检查是否为目录 (`-d`)
- 1.3 检查是否为符号链接 (`-L`)
- 2. 检查文件权限
- 2.1 检查文件是否可读 (`-r`)
- 2.2 检查文件是否可写 (`-w`)
- 2.3 检查文件是否可执行 (`-x`)
- 3. 检查文件状态
- 3.1 检查文件(包括目录)是否存在 (`-e`)
- 3.2 检查文件是否为空 (`-s`)
- 3.3 检查文件是否具有特定权限 (`-o`, `-g`, `-u`)
- 总结
前言
本文将介绍Shell编程中的数组和运算符。Shell数组是一种用于存储多个值的数据结构,可以方便地处理和管理一组相关的数据。我们将学习如何声明、初始化、访问和操作数组。
同时,我们还将介绍Shell中常用的运算符,包括算术运算符、关系运算符、逻辑运算符、字符串运算符和文件测试运算符。这些运算符可以用于执行各种数值和逻辑操作,以及检查文件的属性和状态。
一、 Shell数组
Shell数组是一种用于存储多个值的数据结构。它可以将多个元素组合在一起,并通过索引访问和操作这些元素。在Shell脚本中,数组提供了一种方便的方式来处理和管理一组相关的数据。
1. 声明和初始化数组
在Shell中,可以使用以下语法来声明和初始化一个数组:
array_name=(value1 value2 value3 ...)
其中,array_name
是数组的名称,value1
、value2
、value3
等是数组的元素值。元素值之间用空格分隔。
例如,下面的代码演示了如何声明和初始化一个名为fruits
的数组:
fruits=("apple" "banana" "orange" "grape")
2. 访问数组元素
通过索引可以访问数组中的元素。数组的索引从0开始,依次递增。要访问数组中的元素,可以使用以下语法:
${array_name[index]}
其中,array_name
是数组的名称,index
是要访问的元素的索引。
例如,要访问fruits
数组中的第二个元素,可以使用以下代码:
echo ${fruits[1]}
输出结果为:
banana
3. 数组长度
要获取数组的长度(即元素的个数),可以使用${#array_name[@]}
或${#array_name[*]}
。
例如,下面的代码演示了如何获取fruits
数组的长度:
echo ${#fruits[@]}
输出结果为:
4
4. 遍历数组
可以使用循环结构来遍历数组中的所有元素。以下是使用for
循环遍历数组的示例代码:
for item in ${array_name[@]}; doecho $item
done
上述代码将逐个输出数组array_name
中的所有元素。
5. 修改数组元素
要修改数组中的元素,可以直接通过索引进行赋值操作。例如,下面的代码将fruits
数组的第三个元素修改为pear
:
fruits[2]="pear"
6. 删除数组元素
要删除数组中的元素,可以使用unset
命令。以下是删除fruits
数组的第四个元素的示例代码:
unset fruits[3]
7. 示例
下面是一个完整的示例,展示了如何声明、初始化、访问和遍历一个数组:
# 声明和初始化数组
fruits=("apple" "banana" "orange" "grape")# 访问数组元素
echo ${fruits[1]} # 输出: banana# 获取数组长度
echo ${#fruits[@]} # 输出: 4# 遍历数组
for item in ${fruits[@]}; doecho $item
done# 修改数组元素
fruits[2]="pear"# 删除数组元素
unset fruits[3]
二、Shell运算符
1. 算术运算符
1.1 加法运算符 (+
)
加法运算符用于执行两个数值的相加操作。
示例:
a=10
b=20
c=$((a + b))
echo "结果:$c"
输出:
结果:30
1.2 减法运算符 (-
)
减法运算符用于执行两个数值的相减操作。
示例:
a=30
b=10
c=$((a - b))
echo "结果:$c"
输出:
结果:20
1.3 乘法运算符 (*
)
乘法运算符用于执行两个数值的相乘操作。
示例:
a=5
b=6
c=$((a * b))
echo "结果:$c"
输出:
结果:30
1.4 除法运算符 (/
)
除法运算符用于执行两个数值的相除操作。
示例:
a=20
b=5
c=$((a / b))
echo "结果:$c"
输出:
结果:4
1.5 取余运算符 (%
)
取余运算符用于获取两个数值相除后的余数。
示例:
a=20
b=7
c=$((a % b))
echo "结果:$c"
输出:
结果:6
2. 关系运算符
关系运算符用于比较两个数值之间的关系,返回结果为真或假。
2.1 相等运算符 (==
)
相等运算符用于判断两个数值是否相等。
示例:
a=10
b=20
if [ $a == $b ]
thenecho "a 等于 b"
elseecho "a 不等于 b"
fi
输出:
a 不等于 b
2.2 不相等运算符 (!=
)
不相等运算符用于判断两个数值是否不相等。
示例:
a=10
b=20
if [ $a != $b ]
thenecho "a 不等于 b"
elseecho "a 等于 b"
fi
输出:
a 不等于 b
2.3 大于运算符 (>
)
大于运算符用于判断一个数值是否大于另一个数值。
示例:
a=30
b=20
if [ $a -gt $b ]
thenecho "a 大于 b"
elseecho "a 不大于 b"
fi
输出:
a 大于 b
2.4 小于运算符 (<
)
小于运算符用于判断一个数值是否小于另一个数值。
示例:
a=10
b=20
if [ $a -lt $b ]
thenecho "a 小于 b"
elseecho "a 不小于 b"
fi
输出:
a 小于 b
2.5 大于等于运算符 (>=
)
大于等于运算符用于判断一个数值是否大于或等于另一个数值。
示例:
a=30
b=20
if [ $a -ge $b ]
thenecho "a 大于等于 b"
elseecho "a 小于 b"
fi
输出:
a 大于等于 b
2.6 小于等于运算符 (<=
)
小于等于运算符用于判断一个数值是否小于或等于另一个数值。
示例:
a=10
b=20
if [ $a -le $b ]
thenecho "a 小于等于 b"
elseecho "a 大于 b"
fi
输出:
a 小于等于 b
3. 逻辑运算符
逻辑运算符用于对多个条件进行逻辑运算。
3.1 逻辑与运算符 (&&
)
逻辑与运算符用于判断多个条件是否同时成立。
示例:
a=10
b=20
c=30
if [ $a -gt 5 ] && [ $b -gt 10 ] && [ $c -gt 20 ]
thenecho "条件成立"
elseecho "条件不成立"
fi
输出:
条件成立
3.2 逻辑或运算符 (||
)
逻辑或运算符用于判断多个条件是否有一个成立。
示例:
a=10
b=20
c=30
if [ $a -gt 15 ] || [ $b -gt 25 ] || [ $c -gt 35 ]
thenecho "条件成立"
elseecho "条件不成立"
fi
输出:
条件成立
3.3 逻辑非运算符 (!
)
逻辑非运算符用于对条件进行取反操作。
示例:
a=10
if ! [ $a -gt 5 ]
thenecho "条件成立"
elseecho "条件不成立"
fi
输出:
条件不成立
4. 字符串运算符
字符串运算符用于对字符串进行比较操作。
4.1 相等运算符 (==
)
相等运算符用于判断两个字符串是否相等。
示例:
str1="hello"
str2="world"
if [ $str1 == $str2 ]
thenecho "字符串相等"
elseecho "字符串不相等"
fi
输出:
字符串不相等
4.2 不相等运算符 (!=
)
不相等运算符用于判断两个字符串是否不相等。
示例:
str1="hello"
str2="world"
if [ $str1 != $str2 ]
thenecho "字符串不相等"
elseecho "字符串相等"
fi
输出:
字符串不相等
4.3 字符串为空运算符 (-z
)
字符串为空运算符用于判断一个字符串是否为空。
示例:
str=""
if [ -z $str ]
thenecho "字符串为空"
elseecho "字符串不为空"
fi
输出:
字符串为空
4.4 字符串不为空运算符 (-n
)
字符串不为空运算符用于判断一个字符串是否不为空。
示例:
str="hello"
if [ -n $str ]
thenecho "字符串不为空"
elseecho "字符串为空"
fi
输出:
字符串不为空
三、文件测试运算符
文件测试运算符用于检查文件的各种属性和状态。下面是一些常用的文件测试运算符:
1. 检查文件类型
1.1 检查是否为普通文件 (-f
)
检查给定路径是否为普通文件。
示例:
file="path/to/file.txt"
if [ -f $file ]
thenecho "文件存在且为普通文件"
elseecho "文件不存在或不是普通文件"
fi
1.2 检查是否为目录 (-d
)
检查给定路径是否为目录。
示例:
dir="path/to/directory"
if [ -d $dir ]
thenecho "目录存在"
elseecho "目录不存在"
fi
1.3 检查是否为符号链接 (-L
)
检查给定路径是否为符号链接。
示例:
link="path/to/symlink"
if [ -L $link ]
thenecho "符号链接存在"
elseecho "符号链接不存在"
fi
2. 检查文件权限
2.1 检查文件是否可读 (-r
)
检查文件是否具有读权限。
示例:
file="path/to/file.txt"
if [ -r $file ]
thenecho "文件可读"
elseecho "文件不可读"
fi
2.2 检查文件是否可写 (-w
)
检查文件是否具有写权限。
示例:
file="path/to/file.txt"
if [ -w $file ]
thenecho "文件可写"
elseecho "文件不可写"
fi
2.3 检查文件是否可执行 (-x
)
检查文件是否具有执行权限。
示例:
file="path/to/file.sh"
if [ -x $file ]
thenecho "文件可执行"
elseecho "文件不可执行"
fi
3. 检查文件状态
3.1 检查文件(包括目录)是否存在 (-e
)
检查文件是否存在。
示例:
file="path/to/file.txt"
if [ -e $file ]
thenecho "文件存在"
elseecho "文件不存在"
fi
3.2 检查文件是否为空 (-s
)
检查文件是否为空。
示例:
file="path/to/file.txt"
if [ -s $file ]
thenecho "文件不为空"
elseecho "文件为空"
fi
3.3 检查文件是否具有特定权限 (-o
, -g
, -u
)
检查文件是否具有特定权限,其中 -o
检查文件是否具有所有者权限,-g
检查文件是否具有组权限,-u
检查文件是否具有其他用户权限。
示例:
file="path/to/file.txt"
if [ -o $file ]
thenecho "文件具有所有者权限"
elseecho "文件不具有所有者权限"
fi
总结
通过掌握数组和运算符的使用,您可以更加灵活地编写Shell脚本,处理和管理数据,执行各种操作,并对文件进行检查和处理。
希望本文对您学习Shell编程有所帮助!
相关文章:
shell编程-数组与运算符详解(超详细)
文章目录 前言一、 Shell数组1. 声明和初始化数组2. 访问数组元素3. 数组长度4. 遍历数组5. 修改数组元素6. 删除数组元素7. 示例 二、Shell运算符1. 算术运算符1.1 加法运算符 ()1.2 减法运算符 (-)1.3 乘法运算符 (*)1.4 除法运算符 (/)1.5 取余运算符 (%) 2. 关系运算符2.1 …...

Vim入门
Vim使用入门 1.Vim编辑器的三种常用模式 一般模式:刚打开文件是它,从编辑模式按“ESC”退回的模式也是它。可以执行各种编辑操作,如移动光标、复制、粘贴、删除、查找替换等 ; 编辑模式:在一般模式下按下 i、I、a、A、o、O 等键…...

动态加载库
no_mangle 不要改标识符 首先是认识这个标注:mangle,英文的含义“撕裂、碾压”。我第一次把这个单次误以为是manage,说实话两个单词还挺像的。 RUS中函数或静态变量使用#[no_mangle]这个标注属性后,编译器就不会修改它们的名字了…...
React中渲染html结构---dangerouslySetInnerHTML
dangerouslySetInnerHTML胡子{}语法绑定的内容全部作为普通文本渲染,渲染html结构基于---dangerouslySetInnerHTMLdangerouslySetInnerHTML是React标签的一个属性,类似于vue的v-html有2个{{}},第一个{}代表jsx语法开始,第二个是代表dangerous…...

计网02-计算机网络参考模型
一、OSI七层参考模型 1、分层的思想 分层模型用于网络协议的设计方法,本质是将网络节点间复杂的通信问题分成若干简单的问题逐一解决,通过网络的层次去找问题,将复杂问题简单化。 2、OSI参考模型 由于早期计算机厂商使用的是私有的网络模…...
模块测试:确保软件质量的关键步骤
引言: 在软件开发过程中,模块测试是确保软件质量的关键环节。通过模块化的设计和测试方法,可以提高开发效率、降低错误率,并最终提供稳定可靠的软件产品。本文将介绍模块测试的概念、重要性以及实施步骤,帮助读者了解如…...

Postman接口测试之Postman常用的快捷键
作为一名IT程序猿,不懂一些工具的快捷方式,应该会被鄙视的吧。收集了一些Postman的快捷方式,大家一起动手操作~ 简单操作 xc 请求 操作MAC系统windows系统请求网址 ⌘L Ctrl L 保存请求 ⌘S Ctrl S 保存请求为 ⇧⌘S Ctrl Shift S发送…...

keil自动分配SDRAM空间设置使用
1.修改.sct文件 添加 RW_RAM1 0xC0400000 UNINIT 0x00400000 { ; RW data .ANY (SD_RAM1) 使用 #define LOCATION_ATTRIBUTE(name) __attribute__ ((section(name))) __attribute__ ((aligned(4)))uint8_t sdram_buf[0x100000] __attribute__ ((section("SD_RAM1")…...

TikTok获客怎么做?可以定制一个获客工具!
随着社交媒体的兴起,越来越多的企业开始将目光投向了短视频平台,TikTok作为其中的佼佼者,凭借其独特的算法和内容推荐机制,吸引了大量用户的关注。 那么,如何在TikTok上获取更多的客户呢?本文将为您揭秘TikTok获客的…...

数据结构(Chapter Two -02)—顺序表基本操作实现
在前一部分我们了解线性表和顺序表概念,如果有不清楚可以参考下面的博客: 数据结构(Chapter Two -01)—线性表及顺序表-CSDN博客 首先列出线性表的数据结构: #define MaxSize 50 //定义顺序表最大长度 typedef struct{ElemType data…...

SQL语句整理二--Mysql
文章目录 知识点梳理:1. mysql 中 in 和 exists 区别2. varchar 与 char 的区别 查看表结构:获取当前时间:查看建表语句:修改用户密码:查看所有用户:grant命令:判断当前数据库有多少连接数&…...

oracle与gbase8s迁移数据类型对照
声明:以下为笔者阅读gbase官方文档和oracle官方文档的理解,如有错误,敬请指正。oracle与gbase8s迁移数据类型对照及举例说明 最终结论:oracle与gbase8s数据类型对应关系关于单精度与双精度的区别关于定点与浮点定义的区别精度的定…...
Flink系列之:集合操作
Flink系列之:集合操作 一、集合操作二、UNION三、INTERSECT四、EXCEPT五、IN六、EXISTS 一、集合操作 适用于流、批操作 二、UNION UNION 和 UNION ALL 返回两个表中的数据。 UNION 会去重,UNION ALL 不会去重。 Flink SQL> create view t1(s) as…...
STL:string的常见用法
目录 赋值和连接: operator: 赋值操作符: assign(str): 将字符串赋值为另一个字符串: : 字符串连接操作符: 访问和检查: at(pos): 返回指定位置的字符,提供边界检查。 operator[]: 返回指定位置的字符…...
GBASE南大通用 ADO.NET 中的事务
GBASE南大通用 ADO.NET 中支持事务,可以使用GBASE南大通用Connection 对象的BeginTransaction 函数开始一个事务,并默认使用 ReadCommitted 模式初始化。 事务中可以对单个表执行多个操作,或者对多个表执行多个操作,在事务未提交…...

App(Android)ICP备案号查询——————高仿微信
😄 个人主页:✨拉莫帅-CSDN博客✨🤔 博文:132篇🔥 原创:130篇,转载:2篇🔥 总阅读量:388923❤️ 粉丝量:112🍁 感谢点赞和关注 &#x…...

修改npm源码解决服务端渲染环境中localstorage报错read properties of undefined (reading getItem)
现象: 这个问题是直接指向了我使用的第三方库good-storage,这是一个对localStorage/sessionStorage做了简单封装的库,因为项目代码有一个缓存cache.ts有用到 原因分析: 从表象上看是storage对象找不到getItem方法, 但…...

Educational Codeforces Round 160 (Div. 2) A~C(D,E更新中...)
A.Rating Increase(思维) 题意: 给出一个仅包含数字的字符串 s s s,要求将该字符串按以下要求分成左右两部分 a , b a,b a,b: 两个数字均不包含前导 0 0 0 两个数字均大于 0 0 0 b > a b > a b>a 如果…...

【Maven-Helper】利用 Maven-Helper 解决依赖冲突问题
【Maven-Helper】利用 Maven-Helper 解决依赖冲突问题 1)安装 Maven-Helper 插件2)Maven Helper 插件使用方法3)Idea-Maven 可视化依赖树 1)安装 Maven-Helper 插件 这里我们已经安装过了,如果没有安装过,点…...

C# WPF上位机开发(知识产权ip保护)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 上位机软件如果是和硬件模块搭配开发,这个时候大部分上位机基本上都是白送的,不会收取相关的费用。但是,如果上…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构
React 实战项目:微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇!在前 29 篇文章中,我们从 React 的基础概念逐步深入到高级技巧,涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...

HTTPS证书一年多少钱?
HTTPS证书作为保障网站数据传输安全的重要工具,成为众多网站运营者的必备选择。然而,面对市场上种类繁多的HTTPS证书,其一年费用究竟是多少,又受哪些因素影响呢? 首先,HTTPS证书通常在PinTrust这样的专业平…...

云原生时代的系统设计:架构转型的战略支点
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、云原生的崛起:技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深,传统的 I…...
【大厂机试题解法笔记】矩阵匹配
题目 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...

RocketMQ 客户端负载均衡机制详解及最佳实践
延伸阅读:🔍「RocketMQ 中文社区」 持续更新源码解析/最佳实践,提供 RocketMQ 专家 AI 答疑服务 前言 本文介绍 RocketMQ 负载均衡机制,主要涉及负载均衡发生的时机、客户端负载均衡对消费的影响(消息堆积/消费毛刺等…...