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】 上位机软件如果是和硬件模块搭配开发,这个时候大部分上位机基本上都是白送的,不会收取相关的费用。但是,如果上…...

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

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...