bash数组和关联数组

1.1.1 数组

数组就是变量阵列,多个变量组合到一块,通过同一个名字进行存取操作。数值是连续的多个独立的内存空间(元素),每个内存空间相当于一个变量。数组元素通过“数组名[索引]”进行引用。索引也称为下标,从0而不是1开始编号。

声明数组:declare -a Array_Name

bash的数组支持稀疏格式,所谓的稀疏格式就是,一个数组中的只有两个元素,但这两个元素可以是第一个和第九个,中间的都为空。

1.1.1.1 数组元素赋值

(1) 一次只赋值一个元素

a_name[index]=value --> 数组名[索引]=值

例如:

weekday[0]="Sunday":数组weekday第1个元素为Sunday

weekday[1]="Monday":

(2) 一次赋值全部元素

weekday=("Sunday" "Monday" "Tuesday")

[root tmp]# weekdays=(Sun Mon Tue Wed)
[root tmp]# echo ${weekdays[0]}
Sun
[root tmp]# echo ${weekdays[1]}
Mon

(3) 指定索引进行赋值,支持稀疏格式

weekdays=([0]="Sunday" [3]="Thu" [6]="Sat")

[root tmp]# weekdays=([6]=Sun [0]=Mon [1]=Tue)
[root tmp]# echo ${weekdays[2]}
 
[root tmp]# echo ${weekdays[1]}
Tue
[root tmp]# echo ${weekdays[6]}
Sun

(4) read -a a_name,实现多个数据到数组中。

不使用-a会当成一个元素

[root tmp]# read hello
qw er t
[root tmp]# echo ${hello[1]}
 
[root tmp]# echo ${hello[0]}
qw er t

使用-a就会通过空格区分

[root tmp]# read -a hello
qw er t
[root tmp]# echo ${hello[1]}
er
[root tmp]# echo ${hello[0]}
qw

1.1.1.2 引用数组元素

${array_name[index]},花括号是不可省略的。

获取数组长度(就是获取数组中有多少元素):${#array[*]}, ${#array[@]}

[root tmp]# echo ${#hello[*]}
3

不带下标时,默认为第一个元素:

[root tmp]# echo $hello
qw

因此,此为显示第一个元素中的字符个数:

[root tmp]# echo ${#hello}
2

练习:写一个脚本,生成10个随机数,保存至数据组中,而后显示数组索引为偶数的元素的值。

#!/bin/bash
#
for ((i=0;i<10;i++)); do
rand[$i]=$RANDOM
echo ${rand[$i]}
done
 
echo "========================"
 
for i in `seq 0 2 9`; do
echo ${rand[$i]}
done

练习:写一个脚本,定义一个数组,数组元素为/var/log目录下所有以.log结尾的文件的名字,显示每个文件的行数。

#!/bin/bash
#
declare -a files
 
files=(/var/log/*.log)
 
for i in `seq 0 $[${#files[*]}-1]`; do
wc -l ${files[$i]}
done

1.1.1.3 数组切片

从数组中挑选指定的某个或某些元素:${array[@]:offset:number}

offset:偏移的元素的个数。

number:要取出的元素的个数。

[root ~]# weekdays=(Sun Mon Tue Wed Thu Fri Sat)
[root ~]# echo ${weekdays[@]:2:2}
Tue Wed
[root ~]# echo ${weekdays[@]:3:2}
Wed Thu

取出偏移量之后剩余所有的元素:${array[@]:offset}

[root ~]# echo ${weekdays[@]:3}
Wed Thu Fri Sat

所有元素:${array[@]}

1.1.1.4 数组添加元素

array_name[${#array_name[*]}]=value

稀疏格式这么添加可能会造成覆盖:

[root ~]# hello=([6]=qw [3]=er [4]=ty)
[root ~]# echo ${hello[@]}
er ty qw
[root ~]# hello[${#hello[*]}]=ui
[root ~]# echo ${hello[@]}
ui ty qw

非稀疏格式完全没问题:

[root ~]# hello=(qw er ty ui)
[root ~]# hello[${#hello[*]}]=nm
[root ~]# echo ${hello[@]}
qw er ty ui nm

1.1.1.5 从数组中删除元素

unset array[index],撤销不是引用,一定不要加$。

[root ~]# weekdays=(Sun Mon Tue Wed Thu Fri Sat)
[root ~]# unset weekdays[3]
[root ~]# echo ${weekdays[@]}
Sun Mon Tue Thu Fri Sat

1.1.2 关联数组

bash从4.0版本起支持关联数组,数组索引可为自定的字符串。也就是说数组的下标可以不再是数字了。

定义方法:declare -A array_name

[root ~]# declare -A wdays
[root ~]# wdays=([sun]=Sunday [mon]=Monday [tue]=Tuesday)
[root ~]# echo ${wdays[mon]}
Monday

有了数组之后就可以定义比较复杂的算法了。

时间: 2024-12-09 15:44:30

bash数组和关联数组的相关文章

shell之数组和关联数组

数组和关联数组 #!/bin/bash #定义数组1 array_var1=(1 2 3 4 5 6)# #定义数组2 array_var[0]="test1" array_var[1]="test2" array_var[2]="test3" array_var[3]="test4" array_var[4]="test5" array_var[5]="test6" #打印指定索引的元

linux 普通数组和关联数组

数组:就是借助索引将多个数据存储为一个集合. 普通数组:数组的索引只能使用整数 关联数组:数组的索引可以使用整数和字符串(要bash4.0以上的版本才支持关联数组) 数组通常与循环或者其他判断式交互使用才有比较高的意义 普通数组的定义 array1=(a  ab 12  3a) 数组的索引从0为起始索引 echo ${array1[0]}      输出:a echo ${array1[2]}      输出:12 数组还可以定义成 arry[0]="test0" arry[1]=&q

JS 索引数组、关联数组和静态数组、动态数组

1 JS 索引数组.关联数组和静态数组.动态数组 2 3 数组分类: 4 5 1.从数组的下标分为索引数组.关联数组 6 7 var ary1 = [1,3,5,8]; 8 //按索引去取数组元素,从0开始(当然某些语言实现从1开始) 9 //索引实际上就是序数,一个整型数字 10 alert(ary1[0]); 11 alert(ary1[1]); 12 alert(ary1[2]); 13 alert(ary1[3]); 14 15 16 var ary2 = {}; 17 //存取时,以非

第四章 数组、关联数组和别名使用

第四章 数组.关联数组和别名使用 数组 名词解释 数组作为一种特殊的数据结构在任何一种编程语言中都有它的一席之地,数组在shell脚本中也是非常重要的组成部分,它借助索引将多个独立的数据存储为一个角色. 语法 普通数组只能使用整数作为数组的索引值. 定义数组 格式: arrary[key]=value array=(value value value ...) 数组方法 单行一列值: array_n=(1 2 3 4) 打印数组第一个值: echo ${array_n[0]} # 0 代表数组里

【Linux】数组与关联数组

数组 数组的定义: variable=(arg1 arg2 arg3 -) 中间用空格分开,数组的下标从0开始 1.获取下标为n的元素 variable[n] 不存在数组溢出的情况,如果下标n>=数组长度,那么为空,不会报错. [[email protected] test]# var=(1 2 3) [[email protected] test]# echo ${var[0]} 1 2.获取数组长度 ${#var[@]}或者${#var[*]} [[email protected] test

JavaScript对象之关联数组

Tip: 内容摘抄自<JavaScript权威指南>,看过该书的同学可以忽略本文. 存取一个对象的属性的方式: obj.attr; obj["attr"]; 两者最重要的区别就是前者的属性名是标示符,后者的属性名是一个字符串. 用"."运算符来存取一个对象的属性时,属性名是标示符,JavaScript程序中,标示符必须被逐字输入,它们不是一种数据类型,因此程序不能对他们进行操作. 用数组的概念"[]"来存取一个对象的属性时,属性名是用

shell 脚本-关联数组

shell 的关联数组 Shell Associative Array   bashi没有原生的对于类似hash table的支持,不像perl或python.下标数组元素是通过数组下标(数组下标可以是算术表达式,其结果必须是一个整数)来访问的,但是这种访问方式在表达某些关联性很强的数据时会存在限制.shell 提供了另外一种数组,其可以使用任意的字符串作为下标(不必是整数)来访问数组元素.这种数组叫做关联数组(associative array).关联数组的下标和值称为键值对,它们是一一对应的

perl5 第九章 关联数组/哈希表

第九章 关联数组/哈希表 by flamephoenix 一.数组变量的限制二.定义三.访问关联数组的元素四.增加元素五.创建关联数组六.从数组变量复制到关联数组七.元素的增删八.列出数组的索引和值九.用关联数组循环十.用关联数组创建数据结构  1.(单)链表  2.结构  3.树 一.数组变量的限制    在前面讲的数组变量中,可以通过下标访问其中的元素.例如,下列语句访问数组@array的第三个元素:    $scalar = $array[2];    虽然数组很有用,但它们有一个显著缺陷

php关联数组和索引数组差别

没有查到明确的php中定义关联数组/索引数组的解析,根据phpdocument及百度的一些资料和实际的代码测试,对关联数组/索引数据进行定义解析.这个问题主要在和手机端ios app产品提供api时遇到,用关联数组转换为json能更好的用oc解析转换为数组. 关联数组:没有明确的索引键,默认从0开始作为索引键. $temp_arr = array ( '已经在别处买到', '商品不符合需求', '价格太高', '不想买了', '卖家没有交易记录', '其他原因', ); $temp_arr[0]