阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Bash Shell脚本中的数组使用实例

272次阅读
没有评论

共计 5282 个字符,预计需要花费 14 分钟才能阅读完成。

导读 数组是一个包含多个值的变量,这些值可以是相同类型或不同类型。没有数组大小限制,也没有要求成员变量被连续索引或连续分配的限制。数组索引从 0 开始。
1. 声明一个数组并赋值

在 bash 中,使用以下格式的变量时会自动创建数组:

name[index]=value
  • name 是数组的名字。
  • index 可以是任何数字或表达式,值必须等于或大于零。

要访问数组元素,请使用大括号,例如 ${name[index]}。下面是访问 Unix 数组中的第二个元素, 以为数组索引从 0 开始,所以 Unix[1] 就是第二个元素了。

[root@localhost ~]# cat arraymanip.sh
#! /bin/bash
Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${Unix[1]}

执行脚本,以下是输出内容:

[root@localhost ~]# ./arraymain.sh 
Red hat

Bash Shell 脚本中的数组使用实例

2. 在声明期间初始化数组

不必单独初始化数组的每个元素,可以通过使用括号指定元素列表(由空格分隔)来声明和初始化数组。下面是语法:

declare -a arrayname=(element1 element2 element3)

如果元素具有空格字符,需要使用引号:

[root@localhost ~]# cat arraymain2.sh 

#! /bin/bash
declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora')

echo ${Unix[4]}

下面是输出结果:

[root@localhost ~]# ./arraymain2.sh 
Fedora

Bash Shell 脚本中的数组使用实例
declare -a声明一个数组,括号中的所有元素都是数组的元素。

3. 打印整个数组

有多种方法可以打印整个数组。如果索引号是 @ 或者 * ,则引用数组的所有成员。可以使用 bash shell 中的循环语句遍历数组元素并进行打印。

[root@localhost ~]# cat arraymain.sh 
#! /bin/bash
Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${Unix[@]}

下面是输出结果:

[root@localhost ~]# ./arraymain.sh 
Debian Red hat Ubuntu Suse

Bash Shell 脚本中的数组使用实例

4. 获取数组的长度

可以使用 $ 和 # 的特殊参数来获取数组的长度。${#arrayname[@]} 可以获取数组长度。

[root@localhost ~]# cat arraymain2.sh 
#! /bin/bash
declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora')

echo ${#Unix[@]} #数组中元素的数量
echo ${#Unix}  #数组中第一个元素的字符数。

下面是输出,可以看到第一行输出参数为 5 个。第二行输出第一个元素的字符数量是 6 个。

[root@localhost ~]# ./arraymain2.sh 
5
6

Bash Shell 脚本中的数组使用实例

5. 数组中某个元素的长度

${#arrayname[n]} 给出数组中的 n 个元素的长度。

[root@localhost ~]# cat arraymain.sh 
#! /bin/bash
Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${#Unix[3]} #位于索引 3 的元素的长度。

以下是输出,可以看到输出 index 为 3 的值为 ”Suse” 的字符长度是 4。

[root@localhost ~]# ./arraymain.sh 
4

Bash Shell 脚本中的数组使用实例

6. 按数组的偏移量和长度提取

下面的示例显示了从名为 Unix 的数组中从索引位置 3 开始提取 2 个元素的方法。

[root@localhost ~]# cat arraymain.sh 
#! /bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux')
echo ${Unix[@]:3:2}

以下是输出,

[root@localhost ~]# ./arraymain.sh 
Suse Fedora

Bash Shell 脚本中的数组使用实例
上面的示例返回第三、第四个索引的值。索引始终以零开头。

7. 对于数组的特定元素,使用 offset 和 length 提取

从数组元素中仅提取前四个元素。例如,获取数组中的第二个元素,并且获取这个元素的前三个字符:

[root@localhost ~]# cat arraymain.sh 
#! /bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux')

echo ${Unix[1]:0:3}

以下是输出:

[root@localhost ~]# ./arraymain.sh 
Red

Bash Shell 脚本中的数组使用实例

8. 搜索并替换数组元素

下面的示例在数组中搜索 Ubuntu,并将其替换为单词“FreeBSD”。

[root@localhost ~]# cat arraymain.sh 
#! /bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux')

echo ${Unix[@]/Ubuntu/FreeBSD}

以下是输出:

[root@localhost ~]# ./arraymain.sh 
Debian Red hat FreeBSD Suse Fedora UTS OpenLinux
[root@localhost ~]#

Bash Shell 脚本中的数组使用实例
注意,该数组替换,不会写入到数组里面。

9. 向现有的数组添加元素

以下示例显示了将元素添加到现有数组的方法。

[root@localhost ~]# cat arraymain.sh 
#! /bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux')
Unix=("${Unix[@]}" "AIX" "HP-UX")

echo ${Unix[@]}

以下是输出:

[root@localhost ~]# ./arraymain.sh 
Debian Red hat Ubuntu Suse Fedora UTS OpenLinux AIX HP-UX

Bash Shell 脚本中的数组使用实例
在名为 Unix 的数组中,元素“AIX”和“HP-UX”分别添加在第 7 个索引和第 8 个索引中。并输出所有数组元素。

10. 从数组中删除一个元素

unset用于从数组中删除元素。unset 和分配给元素“Null” 值具有相同的效果。

[root@localhost ~]# cat arraymain.sh 
#! /bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux')

unset Unix[1]

echo ${Unix[@]}
echo ${Unix[1]}

以下为输出:

[root@localhost ~]# ./arraymain.sh 
Debian Ubuntu Suse Fedora UTS OpenLinux

上面的脚本将打印整个数组,还有索引为 ”1″ 的值,索引为“1”的值是 null。
Bash Shell 脚本中的数组使用实例
以下示例显示了从数组中完全删除元素的一种方法,下面还是删除索引为 1 的元素。

[root@localhost ~]# cat arraymain.sh 
#! /bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux')
pos=1
Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))})
echo ${Unix[@]}

以下为输出:

[root@localhost ~]# ./arraymain.sh 
Debian Ubuntu Suse Fedora UTS OpenLinux

Bash Shell 脚本中的数组使用实例
在此示例中,${Unix[@]:0:$pos}值获取第 1 个索引的元素,,而 ${Unix[@]:$(($pos + 1))}将从第 3 个索引到最后一个索引。并合并以上两个输出。这是从数组中删除元素的解决方法之一。

11. 使用正则表达式删除数组中的元素

在搜索条件中,可以给出正则表达式,并将剩余的元素存储到另一个数组中,如下所示。

[root@localhost ~]# cat arraymain2.sh 
#! /bin/bash
declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora')
declare -a pattern=(${Unix[@]/Red*/} )
echo ${pattern[@]}

以下为输出:

[root@localhost ~]# ./arraymain2.sh 
Debian Ubuntu Suse Fedora

Bash Shell 脚本中的数组使用实例
上面的示例中删除了包含 ”Red” 字符的元素。实际是将 ”Red*” 替换为空字符。

12. 复制数组

以下实例是将 Unix 数组复制到 Linux 数组中:

[root@localhost ~]# cat arraymain.sh 
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux')
Linux=("${Unix[@]}")

echo ${Linux[@]}

以下为输出:

[root@localhost ~]# ./arraymain.sh 
Debian Red hat Ubuntu Suse Fedora UTS OpenLinux

Bash Shell 脚本中的数组使用实例

13. 两个数组的关联

展开两个数组的元素,然后将其分配给新数组:

[root@localhost ~]# cat arraymain.sh 
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")
echo ${UnixShell[@]}
echo ${#UnixShell[@]}

以下为输出:

[root@localhost ~]# ./arraymain.sh 
Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh
14

Bash Shell 脚本中的数组使用实例
该实例同时打印数组“Unix”和“Shell”数组的元素,并且新数组的元素数为 14 个。

14. 删除整个数组

unset 用于删除整个数组。

[root@localhost ~]# cat arraymain.sh 
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")

unset UnixShell
echo ${#UnixShell[@]}

以下为输出:

[root@localhost ~]# ./arraymain.sh 
0

Bash Shell 脚本中的数组使用实例
unset数组之后,其长度将为零,如上所示。

15. 将文件内容加载到数组中

您可以将文件内容逐行加载到数组中。

[root@localhost ~]# cat loadcontent.sh 
#!/bin/bash
file=(`cat ./pic.txt`)

for i in "${file[@]}"
do
echo $i
done

echo -e "\033[31m Read file content! \033[0m"

以下为输出:

[root@localhost ~]# ./loadcontent.sh 
https://www.linuxprobe.com/wp-content/uploads/2021/01/windows7.png
https://www.linuxprobe.com/wp-content/uploads/2016/12/bigdata.jpg
https://www.linuxprobe.com/wp-content/uploads/2021/01/write-games-and-learn-python.jpg
https://www.linuxprobe.com/wp-content/uploads/2021/01/data-center-inspection.jpg
https://www.linuxprobe.com/wp-content/uploads/2020/03/devolop-like-linux-09.jpg
 Read file content!

Bash Shell 脚本中的数组使用实例
在上面的示例中,使用 for 循环,逐一显示文件中每行的内容。

总结

数组是一个包含多个值的变量,这些值可以是相同类型或不同类型。没有数组大小限制,也没有要求成员变量被连续索引或连续分配的限制。数组索引从 0 开始。

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计5282字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7959702
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...