Linux shell编程学习笔记15:定义数组、获取数组元素值和长度

这篇具有很好参考价值的文章主要介绍了Linux shell编程学习笔记15:定义数组、获取数组元素值和长度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 * 20231103 增加了 五、数组拼接或合并

一、 Linux shell 脚本编程中的数组概述

数组是一种常见的数据结构。跟大多数编程语言一样,大多数Linux shell脚本支持数组,但对数组的支持程度各不相同,比如数组的维度,是支持一维数组还是多维数组?再如,数组元素的下标是从 0 开始还是从1开始?则因shell而异,下面我们以zsh、sh、bash为例来讲解。

二、数组的定义

在Linux shell脚本编程中,定义数组有两种方法。

(一)数组名=(数值1 数值2 …… 数值n)

数值之间用空格间隔。

实例:

1.在zsh中

(1)在命令行定义

# csdn @ edu in ~ [21:37:32] 
$ a=(1 'a' b)

# csdn @ edu in ~ [21:37:42] 
$ echo $a
1 a b

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

我们首先用命令 a=(1 'a' b) 定义了数组a

然后用命令  echo $a 显示数组a 的元素。

(2)在脚本文件中定义

# csdn @ edu in ~ [22:20:47] C:1
$ echo 'a=(1 'a' b)' > a.sh 

# csdn @ edu in ~ [22:21:31] 
$ echo 'echo $a' >> a.sh

# csdn @ edu in ~ [22:21:48] 
$ cat a.sh
a=(1 a b)
echo $a

# csdn @ edu in ~ [22:21:51] 
$ source ./a.sh
1 a b

# csdn @ edu in ~ [22:22:01] 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

在上面的实例中,我们首先使用使用echo + 输出重定向方式将数组定义语句 echo 'a=(1 'a' b)' > a.sh  写入脚本文件 a.sh

然后 将 显示数组a元素的命令 echo 'echo $a' >> a.sh 写入脚本文件 a.sh

接下来我们使用cat命令查看脚本文件 a.sh的内容:

a=(1 a b)
echo $a

最后,我们使用命令 source ./a.sh  执行脚本文件a.sh。

注意,在上面创建的脚本文件 a.sh中,我们没有在第一行写入shebang或hashbang语句来指定脚本解释器。

2.在sh中

 (1)在命令行定义

[csdn ~]$ exec sh
sh-4.2$ a=(1 'a' b)
sh-4.2$ echo $a
1
sh-4.2$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

(2)在脚本文件中定义

sh-4.2$ echo 'a=(1 'a' b)' > a.sh
sh-4.2$ echo 'echo $a' >> a.sh
sh-4.2$ cat a.sh
a=(1 a b)
echo $a
sh-4.2$ . a.sh
sh: .: a.sh: file not found
sh-4.2$ source ./a.sh
1
sh-4.2$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

3.在bash中

 (1)在命令行定义

# csdn @ edu in ~ [23:27:45] C:127
$ exec bash
[csdn ~]$ echo $0
bash
[csdn ~]$ a=(1 'a' b)
[csdn ~]$ echo $a
1
[csdn ~]$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

在bash中,数组同样创建起来了,与上面不同的是,命令  echo $a 只显示了数组中的第1个元素,而不是所有元素。 

 (2)在脚本文件中定义

[csdn ~]$ echo 'a=(1 'a' b)' > a.sh
[csdn ~]$ echo 'echo $a' >> a.sh
[csdn ~]$ cat a.sh
a=(1 a b)
echo $a
[csdn ~]$ . a.sh
1
[csdn ~]$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

与上面的在命令行定义数组一样,bash中的命令  echo $a 只显示了数组中的第1个元素,而不是所有元素。 

(二)数组名[下标]=数值

1.在zsh中

(1)在命令行定义

csdn @edu in ~ b[0]=0
zsh: b: assignment to invalid subscript range
csdn @edu in ~ b[1]=1 
csdn @edu in ~ b[2]=a 
csdn @edu in ~ echo $b
1 a
csdn @edu in ~ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

在上面的例子中,我们首先尝试直接在命令行定义数组元素:b[0]=0,但是zsh提示下标超出范围。

接下来,我们的命令  b[1]=1 和  b[2]=a 顺利完成,最后我们用命令 echo $b 显示 数组b的2个元素值:1 a。

可见,在zsh中,数组元素的下标是从1开始的。

(2)在脚本文件中定义

$ echo 'b[0]=0' > b.sh

# csdn @ edu in ~ [22:07:01] 
$ echo 'b[1]=1' >> b.sh

# csdn @ edu in ~ [22:07:24] 
$ echo 'b[2]=a' >> b.sh 

# csdn @ edu in ~ [22:07:39] 
$ echo 'echo $b' >> b.sh 

# csdn @ edu in ~ [22:08:05] 
$ cat b.sh   
b[0]=0
b[1]=1
b[2]=a
echo $b

# csdn @ edu in ~ [22:08:17] 
$ source ./b.sh
./b.sh:1: b: assignment to invalid subscript range

# csdn @ edu in ~ [22:08:27] C:126
$ bash ./b.sh  
0

# csdn @ edu in ~ [22:08:53] 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

接着我们使用echo + 输出重定向方式将数组定义语句

b[0]=0
b[1]=1
b[2]=a

 写入脚本文件b.sh

然后 我们将 显示数组元素 的命令 echo 'echo $b' >> b.sh 写入脚本文件b.sh

随后我们使用命令 cat b.sh    查看脚本文件b.sh 的内容:

b[0]=0
b[1]=1
b[2]=a
echo $b

接下来我们使用命令 source ./b.sh 来执行脚本文件b.sh,但是命令在zsh下出错了:

./b.sh:1: b: assignment to invalid subscript range

这再次说明,在zsh中,数组元素的下标是从1开始的。

最后我们使用命令 bash ./b.sh  来执行脚本,命令顺利完成。

可见,在bash 中,数组元素的下标是从0开始的。

2.在sh中

(1)在命令行中定义 

csdn @edu in ~ exec sh
sh-4.2$ b[0]=0
sh-4.2$ b[1]=1
sh-4.2$ b[2]=a
sh-4.2$ echo $b
0
sh-4.2$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

数组成功创建,但只看到了数组中的第1个元素值。

(2)在脚本文件中定义

sh-4.2$ echo 'b[0]=0' > b.sh
sh-4.2$ echo 'b[1]=1' >> b.sh
sh-4.2$ echo 'b[2]=a' >> b.sh 
sh-4.2$ echo 'echo $b' >> b.sh
sh-4.2$ cat b.sh
b[0]=0
b[1]=1
echo $b
sh-4.2$ source ./b.sh
0
sh-4.2$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

我们先使用echo + 输出重定向方式将数组定义语句

b[0]=0
b[1]=1
b[2]=a

 写入脚本文件b.sh

然后 我们将 显示数组元素 的命令 echo 'echo $b' >> b.sh 写入脚本文件b.sh

随后我们使用命令 cat b.sh    查看脚本文件b.sh 的内容:

b[0]=0
b[1]=1
b[2]=a
echo $b

最后我们使用   source ./b. sh 命令来执行脚本文件b.sh,数组成功创建,但只看到了数组中的第1个元素值。

3.在bash中

(1)在命令行中定义

# csdn @ edu in ~ [23:53:42] 
$ exec bash
[csdn ~]$ echo $0
bash
[csdn ~]$ b[0]=0
[csdn ~]$ b[1]=1
[csdn ~]$ b[2]=a
[csdn ~]$ echo $b
0
[csdn ~]$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

命令全部顺利执行,可见在bash中,数组元素的下标是从0开始的,但echo $b只显示了数组第1个元素值。

(2)在脚本文件中定义

[csdn ~]$ echo b[0]=0 > b.sh
[csdn ~]$ echo b[1]=1 >> b.sh
[csdn ~]$ echo b[2]=a >> b.sh
[csdn ~]$ echo 'echo $b' >> b.sh
[csdn ~]$ cat b.sh
b[0]=0
b[1]=1
b[2]=a
echo $b
[csdn ~]$ . b.sh
0
[csdn ~]$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

在脚本文件中执行跟 命令行执行结果是一样的。

(三)小结

在zsh中,数组元素的下标是从 1 开始的,使用“$数组名” 可以获得数组所有元素值。

在sh和bash中,数组元素的下标是从 0 开始的,使用“$数组名” 只能获得数组第1个元素值。

三、获取所有的数组元素

通过上面的实例,我们发现在sh和bash中,使用“$数组名” 只能获得数组第1个元素值,那么如何获取所有的数组元素呢?我们可以使用* 或 @ 作为下标来获取,具体格式即:

${数组名[@]} 

${数组名[*]}

(一)zsh中

# csdn @ edu in ~ [12:24:50] 
$ echo $0
/bin/zsh

# csdn @ edu in ~ [12:25:24] 
$ a=(1 2 'a')

# csdn @ edu in ~ [12:25:42] 
$ echo $a
1 2 a

# csdn @ edu in ~ [12:27:06] 
$ echo ${a[@]}
1 2 a

# csdn @ edu in ~ [12:27:39] 
$ echo ${a[*]} 
1 2 a

# csdn @ edu in ~ [12:32:40] 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

(二)在sh中

# csdn @ edu in ~ [12:32:40] 
$ exec sh
sh-4.2$ a=(1 2 'a')
sh-4.2$ echo $a
1
sh-4.2$ echo ${a[@]}
1 2 a
sh-4.2$ echo ${a[*]}
1 2 a
sh-4.2$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

(三)在bash中

sh-4.2$ exec bash
[csdn ~]$ a=(1 2 'a')
[csdn ~]$ echo $a
1
[csdn ~]$ echo ${a[@]}
1 2 a
[csdn ~]$ echo ${a[*]}
1 2 a
[csdn ~]$ 

四、获取数组或数组元素的长度

在介绍字符串时,我们说过获取字符串的格式是:${#字符串名},获取数组或数组元素长度的格式是相似的:

${#数组名[下标]}

${#数组名[下标]}

如果要取数组的长度,那么下标就用*或 @。如果要取数组某个元素的长度,那么下标就用元素的下标。

(一)在zsh中

# csdn @ edu in ~ [12:57:21] 
$ echo $0
/bin/zsh

# csdn @ edu in ~ [12:57:24] 
$ b[1]=1 

# csdn @ edu in ~ [12:57:31] 
$ b[2]=22 

# csdn @ edu in ~ [12:57:36] 
$ echo ${b[*]}
1 22

# csdn @ edu in ~ [12:57:49] 
$ echo ${#b[*]}
2

# csdn @ edu in ~ [12:57:55] 
$ echo ${#b[@]}
2

# csdn @ edu in ~ [12:57:59] 
$ echo ${b[0]} 


# csdn @ edu in ~ [12:58:07] 
$ echo ${#b[0]}
0

# csdn @ edu in ~ [12:58:11] 
$ echo ${b[1]} 
1

# csdn @ edu in ~ [12:58:26] 
$ echo ${#b[1]}
1

# csdn @ edu in ~ [12:58:30] 
$ echo ${b[2]} 
22

# csdn @ edu in ~ [12:58:35] 
$ echo ${#b[2]}
2

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

(二)sh中

# csdn @ edu in ~ [13:07:28] 
$ exec sh
sh-4.2$ b[1]=1
sh-4.2$ b[2]=22
sh-4.2$ echo ${b[*]}
1 22
sh-4.2$ echo ${#b[*]}
2
sh-4.2$ echo ${#b[@]}
2
sh-4.2$ echo ${b[0]}

sh-4.2$ echo ${#b[0]}
0
sh-4.2$ echo ${b[1]}
1
sh-4.2$ echo ${#b[1]}
1
sh-4.2$ echo ${b[2]}
22
sh-4.2$ echo ${#b[2]}
2
sh-4.2$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

(三)bash中

[csdn ~]$ b[1]=1
[csdn ~]$ b[2]=22
[csdn ~]$ echo ${b[@]}
1 22
[csdn ~]$ echo ${#b[@]}
2
[csdn ~]$ echo ${#b[*]}
2
[csdn ~]$ echo ${b[0]}

[csdn ~]$ echo ${#b[0]}
0
[csdn ~]$ echo ${b[1]}
1
[csdn ~]$ echo ${#b[1]}
1
[csdn ~]$ echo ${b[2]}
22
[csdn ~]$ echo ${#b[2]}
2
[csdn ~]$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

在上面的实例中,由于zsh中数组元素下标是从1开始的,所以我们定义数组b时,是从下标为1 的元素开始的。

然后我们先获取整个数组的元素值和长度,然后从下标0开始获取数组每个元素的值和长度。

值得注意的是,我们使用命令 echo ${b[0]} 尝试显示数组b中下标为0 的元素值 时,系统没有提示出错;使用命令echo ${#b[0]}尝试显示数组b中下标为0 的元素的长度时,系统反馈为0。

五、数组拼接或合并

我们先定义两个数组a1=(1 2) 和a2=(3 4) ,我们再定义一个数组a3,它的元素是数组a1和a2的合集。

(一) 在zsh中

# csdn @ edu in ~ [22:10:50] 
$ a1=(1 2); a2=(3 4);a3=(${a1[*]} ${a2[@]}); echo $a3
1 2 3 4

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标

(二)在bash中

[csdn ~]$ a1=(1 2)
[csdn ~]$ a2=(3 4)
[csdn ~]$ a3=(${a1[*]} ${a2[@]})
[csdn ~]$ echo ${a3[*]}
1 2 3 4
[csdn ~]$ 

linux 获取数组长度,Linux世界,麒麟操作系统,系统维护,1024程序员节,linux,linux shell,脚本编程,学习笔记,数组,数组下标文章来源地址https://www.toymoban.com/news/detail-736248.html

到了这里,关于Linux shell编程学习笔记15:定义数组、获取数组元素值和长度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux shell编程学习笔记25:tty

    在 1830 年代和 1840 年代,开发了称为电传打字机(teletypewriters)的机器,这些机器可以将发件人在键盘上输入的消息“沿着线路”发送在接收端并打印在纸上。 电传打字机的名称由teletypewriters, 缩短为teletypes,并最终缩短为 TTY。 电传打字机:teletypewriters →  teletypes → t

    2024年02月05日
    浏览(54)
  • Linux shell编程学习笔记29:shell自带的 脚本调试 选项

    Linux shell脚本的调试方法比较多,上次我们探讨和测试了shell内建命令set所提供的一些调试选项,其实 shell 本身也提供了一些调试选项。我们以bash为例来看看。 purleEndurer @ csdn ~ $ bash --help GNU bash, version 4.2.46(2)-release-(x86_64-redhat-linux-gnu) Usage:  bash [GNU long option] [option] ...      

    2024年02月04日
    浏览(54)
  • Linux shell编程学习笔记39:df命令

    0 前言 1  df命令的功能、格式和选项说明 1.1 df命令的功能 1.2 df命令的格式 1.3 df命令选项说明  2 df命令使用实例  2.1  df:显示主要文件系统信息 2.2 df -a:显示所有文件系统信息 2.3 df -t[=]TYPE或--type[=]TYPE:显示TYPE指定类型的文件系统信息 2.4 df --total:追加显示统计信息 2

    2024年01月16日
    浏览(59)
  • Linux shell编程学习笔记40:stat命令

    “程序员必备的面试技巧,就像是编写一段完美的代码一样重要。在面试战场上,我们需要像忍者一样灵活,像侦探一样聪明,还要像无敌铁金刚一样坚定。只有掌握了这些技巧,我们才能在面试的舞台上闪耀光芒,成为那个令HR们心动的程序猿!” 目录 0 前言 1 DOS、Wind

    2024年01月19日
    浏览(54)
  • Linux shell编程学习笔记36:read命令

     *更新日志  *2023-12-18 1.根据[美] 威廉·肖特斯 (Willian shotts)所著《Linux命令行大全(第2版)》                         更新了-e、-i、-r选项的说明                       2.更新了 2.8 的实例,增加了gif动图                       3.补充了-i的应用实例 2.12 目录 目录

    2024年02月04日
    浏览(44)
  • Linux shell编程学习笔记47:lsof命令

    今天国产电脑提示磁盘空间已耗尽,使用用df命令检查文件系统情况,发现/dev/sda2已使用100%。 Linux shell编程学习笔记39:df命令 https://blog.csdn.net/Purpleendurer/article/details/135577571 于是开始清理磁盘空间。 第一步是查看已删除、但空间却没有释放的进程。 这里要用到 lsof命令。

    2024年04月27日
    浏览(43)
  • Linux shell编程学习笔记33:type 命令

     目录 0 引言 1 type 命令的功能和格式 1.1 type命令的功能 1.2 type 命令的格式 2 type命令用法实例 2.1用type命令查看shell内置命令(以echo命令为例) 2.2 用type命令查看别名(以ls命令为例) 2.3 用type命令同时查看shell内置命令和别名(以echo和ls命令为例) 2.4 用type命令查看外部

    2024年02月03日
    浏览(52)
  • Linux shell编程学习笔记41:lsblk命令

    边缘计算面临着数据安全与隐私保护、网络稳定性等挑战,但同时也带来了更强的实时性和本地处理能力,为企业降低了成本和压力,提高了数据处理效率。因此,边缘计算既带来了挑战也带来了机遇,需要我们不断地研究 前几节学习我们均涉及到磁盘和文件存储,今天我们

    2024年01月24日
    浏览(47)
  • Linux shell编程学习笔记17:for循环语句

    Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算,同样也需要进行根据条件进行流程控制,提供了if、for、while、until等语句。  之前我们探讨了if语句,现在我们来探讨for循环语句。 Linux Shell中的for语句十分灵活,格式多样,我

    2024年02月06日
    浏览(45)
  • Linux shell编程学习笔记18:while循环语句

    上回我们研究和探讨了Linux shell编程中for 循环语句,与在C/C++中一样,for 循环语句Linux shell编程中有很多灵活的用法。今天我们来研究和探讨while循环语句。 我们继续以for循环语句中的例子,计算 从1到10与2的乘积 并输出。 1.在zsh命令行中 # csdn @ edu in ~ [20:35:57]  $ i=1; while

    2024年02月06日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包