0.理解数组

(1)shell不限制数组的大小,数组元素的下标从0开始计数

(2)获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式,但是下标必须大于等于0

(3)bash shell只支持一维数组,不支持多维数组

1.数组的定义

在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔。由此,定义数组的一般形式为:array_name=(ele1  ele2  ele3 ... elen)

注意,赋值号=两边不能有空格,必须紧挨着数组名和数组元素。

情形
脚本
解释
定义数组

nums=(29 100 13 8 91 44)

echo ${nums[*]}----->29 100 13 8 91 44

Shell 是弱类型的,它并不要求所有数组元素的类型必须相同

arr=(20 56 "http://c.biancheng.net/shell/")

第三个元素就是一个“异类”,前面两个元素都是整数,而第三个元素是字符串。
Shell 数组的长度不是固定的,定义之后还可以增加元素

nums=(29 100 13 8 91 44)

nums[6]=88

echo ${nums[*]}------>9 100 13 8 91 44 88

无需逐个元素地给数组赋值,下面的代码就是只给特定元素赋值:

ages=([3]=24 [5]=19 [10]=12)

以上代码就只给第 3、5、10 个元素赋值,所以数组长度是 3。

  • echo ${ages[3]}------->24
  • echo ${ages[4]}------->空
  • echo ${ages[5]}------->19
  • echo ${ages[11]}------>空

注意到虽然数组长度是3,但是该数组只在指定位置有真实值,其他位置的值都为空,即使下标位置越界,其值依然为空,不会报错

2.获取数组元素

获取数组元素的值,一般使用下面的格式:${array_name[index]},其中,array_name 是数组名,index 是下标。

脚本
结果
#!/bin/bash
nums=(1 3 5 7)
echo '输出所有数组元素:'${nums[*]}
echo '输出第2个元素:'${nums[2]}
nums[5]=8#给第5个元素赋值(此时会增加数组长度)
echo '输出第3个元素:'${nums[3]}
echo '输出第4个元素:'${nums[4]}
echo '输出第5个元素:'${nums[5]}
echo '输出所有数组元素:'${nums[@]}
运行结果:

输出所有数组元素:1 3 5 7

输出第2个元素:5

输出第3个元素:7

输出第4个元素:

输出第5个元素:8

输出所有数组元素:1 3 5 7 8

${nums[2]} 获取数组的第二个元素

${nums[*]} ${nums[@]}使用@*可以获取数组中的所有元素

3.计算数组长度

数组长度,即数组元素的个数,可以使用#来获取数组元素的个数。

情形
脚本
结果
使用#来获取数组元素的个数 ${#array_name[@]}
${#array_name[*]}
 
获取指定下标位置的元素长度

获取 arr 数组的第 2 个元素(假设它是字符串)的长度。

${#arr[2]}

 
字符串长度的获取方式 ${#string_name}  
举栗
#!/bin/bash
nums=(1 3 5 7)
echo '输出数组的长度:'${#nums[*]} var1='qwertyuiop'
echo '字符串长度:'${#var1} nums[8]=${var1}
echo '输出数组的长度:'${#nums[@]}
echo '第1个元素的长度:'${#nums[1]}
echo '第8个元素的长度:'${#nums[8]} unset nums[1]#删除元素
echo '输出数组的长度:'${#nums[@]}
运行结果:

输出数组的长度:4

字符串长度:10

输出数组的长度:5

第1个元素的长度:1

第8个元素的长度:10

输出数组的长度:4

4.拼接数组

所谓 Shell 数组拼接就是将两个数组连接成一个数组。
拼接数组的思路是:先利用@*,将数组扩展成列表,然后再合并到一起。具体格式如下:

array_new=(${array1[@]}  ${array2[@]})
array_new=(${array1[*]}  ${array2[*]})

举栗
结果
#!/bin/bash
arr1=(1 2)
arr2=(qwer tyui)
array_new1=(${arr1[*]} ${arr2[@]})
array_new2=(${arr1[@]} ${arr2[*]})
echo ${array_new1[*]}
echo ${array_new2[@]}
运行结果:

1 2 qwer tyui

1 2 qwer tyui

5.删除数组元素或数组

情形
脚本
结果
使用 unset 关键字来删除数组元素 unset array_name[index]  
删除整个数组 unset array_name  
举栗
  1. #!/bin/bash
  2. arr=(23 56 99 66 )
  3. unset arr[1]
  4. echo ${arr[@]}
  5. unset arr
  6. echo ${arr[*]}

运行结果:

23 99 66

注意最后的空行,它表示什么也没输出,因为数组被删除了,所以输出为空

6.关联数组

shell中的关联数组类似于Python中字典的概念,关联数组也成为键值对数组,键(key)即数组的下标,值(value)即元素值。

6.1 创建关联数组

创建关联数组必须使用带有-A选项的 declare 命令

情形
脚本
新定义后赋值
  1. declare -A people
  2. color['num1']=xiaohong
  3. color[num2]=xiaobai
  4. color["num3"]=xiaohei
定义时同时赋值
  1. declare -A people=(['num1']='xiaohong' [num2]='xiaobai' [num3]=xiaohei)

6.2 访问关联数组元素

情形
脚本
结果
获取关联数组的元素值 $(array_name["index"])

echo ${people[num1]}-----> xiaohong

获取所有元素的下标 ${!array_name[@]}
${!array_name[*]}

echo ${people[*]}----->xiaohong xiaobai xiaohei

echo ${people[@]}----->xiaohong xiaobai xiaohei

获取所有元素的值 ${array_name[@]}
${array_name[*]}

echo ${!people[*]}-----> num1 num2 num3

echo ${!people[@]}-----> num1 num2 num3

获取关联数组长度

与获取普通数组长度的方式相同

${#array_name[*]}
${#array_name[@]}

echo ${#people[*]}-----> 3

echo ${#people[@]}-----> 3

举栗
#!/bin/bash
declare -A people=(['num1']='xiaohong' [num2]='xiaobai' [num3]=xiaohei)
echo '联合数组的key值为:'${!people[*]}
echo '联合数组元素值为:'${people[*]}
echo '联合数组的长度为:'${#people[@]}
echo '循环打印联合数组的key值'
for item in ${!people[@]};do
echo ${item}
done echo '循环打印联合数组的元素值'
for item in ${people[*]};do
echo ${item}
done echo '循环打印联合数组的键值对'
for item in ${!people[@]};do
echo ${item}--\>${people[$item]}
done
运行结果:

  • 联合数组的key值为:num1 num2 num3
  • 联合数组元素值为:xiaohong xiaobai xiaohei
  • 联合数组的长度为:3
  • 循环打印联合数组的key值
  • num1
  • num2
  • num3
  • 循环打印联合数组的元素值
  • xiaohong
  • xiaobai
  • xiaohei
  • 循环打印联合数组的键值对
  • num1-->xiaohong
  • num2-->xiaobai
  • num3-->xiaohei

总结:

1、定义 list1=(a b c)
2、获取item个数: ${#list1[@]} ${#list1[*]}
3、获取某个item:${list1[0]},${list1[1]}
4、转换成以空格分隔各item的字符串: str=${list1[*]} str=${list1[@]}
5、把以空格分隔的字符串转换成list:str="a b c"; list1=($str); echo ${#list1[@]};

 

5shell中的数组的更多相关文章

  1. 前端开发:Javascript中的数组,常用方法解析

    前端开发:Javascript中的数组,常用方法解析 前言 Array是Javascript构成的一个重要的部分,它可以用来存储字符串.对象.函数.Number,它是非常强大的.因此深入了解Array ...

  2. JavaScript jQuery 中定义数组与操作及jquery数组操作

    首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...

  3. java 在循环中删除数组元素

    在写代码中经常会遇到需要在数组循环中删除数组元素的情况,但删除会导致数组长度变化. package com.fortunedr.thirdReport; import java.util.ArrayL ...

  4. Objective-C中把数组中字典中的数据转换成URL

    可能上面的标题有些拗口,学过PHP的小伙伴们都知道,PHP中的数组的下标是允许我们自定义的,PHP中的数组确切的说就是键值对.而在OC我们要用字典(Dictionary)来存储,当然了Java用的是M ...

  5. GCC 中零长数组与变长数组

    前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...

  6. C++中的数组

    数组名作为参数时,传递的是数组的首地址, 主调函数中实参数组元素个数不应该少于形参数组的元素个数 把数组名作为参数时,一般不指定数组第一维的大小 即使指定,编译时也会被忽略的.

  7. javascript中关于数组的一些鄙视题

    一.判断一个数组中是否有相同的元素 /* * 判断数组中是否有相同的元素的代码 */ // 方案一 function isRepeat1(arrs) { if(arrs.length > 0) ...

  8. Oc中的数组

    ========================== 数组 ========================== 一.认识数组 oc中可以把NSObject对象的子类放到数组这个集合中,但是int.f ...

  9. Javascript中判断数组的正确姿势

    在 Javascript 中,如何判断一个变量是否是数组? 最好的方式是用 ES5 提供的 Array.isArray() 方法(毕竟原生的才是最屌的): var a = [0, 1, 2]; con ...

随机推荐

  1. 第12讲 | TCP协议(下):西行必定多妖孽,恒心智慧消磨难

    第12讲 | TCP协议(下):西行必定多妖孽,恒心智慧消磨难 如何做个靠谱的人? 有问有答,任务发送和接收有记录,完成有反馈. 如何实现一个靠谱的协议? TCP 协议使用的也是同样的模式.为了保证顺 ...

  2. Scrum Master 生存指南

    近年来,出现了一批新兴且广受关注的岗位,以 Scrum Master 为典型代表.2018年,Scrum Master 的平均工资为98239美元.领英更是将其列为2019年最有前途的工作之一.但对于 ...

  3. Azure DevOps(二)利用Azure DevOps Pipeline 构建基础设施资源

    一,引言 上一篇文章记录了利用 Azure DevOps 跨云进行构建 Docker images,并且将构建好的 Docker Images 推送到 AWS 的 ECR 中.今天我们继续讲解 Azu ...

  4. Net Core 5.0 部署IIS错误-500.31-Failed to load ASP.NET Core runtime

    Windows Server 2008 R2不支持.net core 3.0版本及以后更新的各个版本. 面对如上图提示,第一想到的就是服务器安装的SDK或者hosting版本有问题,第一时间检查了安装 ...

  5. python+selenium基础篇,cookie绕过验证码小案例

    1.绕过验证码有许许多多的方法,笔者在此介绍其中的一个小方法,原理其实就是获取已登陆了之后的凭证(会话保存在本地的cookie中)再打开另一个页面的使用 2.F12(浏览器开发者调试工具)可以查看的需 ...

  6. 11-05 File类

    1. 通过File输出当前项目目录下的文件"myfile.txt"的名字,大小,最后修改时间. 最后修改时间格式如:2016-03-23 14:22:16 package com. ...

  7. 【Azure 环境】由为存储账号(Storage Account)拒绝分配权限而引出的Azure 蓝图(Blueprint)使用问题

    问题描述 当打开Azure存储账号(Storage Account)门户页面时,从 "访问控制(标识和访问管理)" 页面中发现有"拒绝分配"的功能,所以就思考, ...

  8. 【C++】fopen与fopen_s

    说明: VS2010中使用fopen,是没有问题的.使用VS2015时由于VS的高版本对文件操作的安全性有了较高的要求,所以会出现如下情况: fopen用法:  fp = fopen(filename ...

  9. mybatis自定义打印执行时间并格式化sql插件

    打印SQL的执行时间,我们可以实现mybatis官方我们提供的接口org.apache.ibatis.plugin.Interceptor,我们可以拦截的类有多个Executor,StatementH ...

  10. ld-linux-x86-64消耗大量的CPU

    1.现象: 服务器CPU使用率很高 top查看cpu使用进程: 2.进程用户是oracle,根据spid查看是否是数据库进程,经过查询发现:不是数据库内部的进程 select a.sql_id,a.s ...