一文教你入门shell脚本4.0——Shell数组详解

一、Shell数组

Shell 也支持数组。数组(Array)是若干数据的集合。

1、定义

定义数组的一般形式为:

array_name=(ele1  ele2  ele3 ... elen)
  • 用括号( )来表示数组,数组元素之间用空格来分隔
  • 赋值号=两边不能有空格,必须紧挨着数组名和数组元素。

2、特征

  • 1、Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。
  • 2、Shell 数组元素的下标也是从 0 开始计数。
  • 3、Shell获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
  • 4、Bash Shell 只支持一维数组,不支持多维数组。
  • 5、Shell 是弱类型的,它并不要求所有数组元素的类型必须相同

3、使用

3.1、定义数组实例

nums=(29 100 13 8 91 44)

arr=(20 56 "helloworld")

Shell 数组的长度不是固定的,定义之后还可以增加元素。例如,对于上面的 nums 数组,它的长度是 6,使用下面的代码会在最后增加一个元素,使其长度扩展到 7:

 nums[6]=88

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

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

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

3.2、获取数组元素

${array_name[index]}

array_name 是数组名,index 是下标。

n=${nums[2]}

表示获取 nums 数组的第二个元素,然后赋值给变量 n

echo ${nums[3]}

输出 nums 数组的第 3 个元素。

${nums[*]}
${nums[@]}

使用@*可以获取数组中的所有元素

#!/bin/bash

nums=(29 100 13 8 91 44)
echo ${nums[@]}  #输出所有数组元素
nums[10]=66  #给第10个元素赋值(此时会增加数组长度)
echo ${nums[*]}  #输出所有数组元素
echo ${nums[4]}  #输出第4个元素

在这里插入图片描述

3.3、数组长度

数组长度,就是数组元素的个数。使用#来获取数组元素的个数

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

如果某个元素是字符串,还可以通过指定下标的方式获得该元素的长度

${#arr[2]}

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

${#string_name} #string_name 是字符串名。

实例

#!/bin/bash

nums=(29 100 13)
echo ${#nums[*]}

#向数组中添加元素
nums[10]="helloworld"
echo ${#nums[@]}
echo ${#nums[10]}

#删除数组元素
unset nums[1]
echo ${#nums[*]}
echo ${nums[*]}

在这里插入图片描述

3.4、数组拼接

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

利用@*,将数组扩展成列表,然后再合并到一起。

两种方式是等价的,选择其一即可。其中,array1array2 是需要拼接的数组,array_new 是拼接后形成的新数组。

#!/bin/bash

array1=(23 56)
array2=(99 "hello,KOBE")
array_new=(${array1[@]} ${array2[*]})

echo ${array_new[@]}  #也可以写作 ${array_new[*]}

在这里插入图片描述

3.5、数组删除

unset array_name[index]

unset 关键字来删除数组元素,array_name 表示数组名,index 表示数组下标。

#!/bin/bash

array1=(8 "hi,GiGi")
array2=(24 "hello,KOBE")
array_new=(${array1[@]} ${array2[*]})

echo ${array_new[*]}

unset array_new[0]
echo ${array_new[*]}

在这里插入图片描述

二、Shell关联数组

关联数组使用字符串作为下标,而不是整数,可以使用任意的文本作为数组索引。

1、定义

关联数组也称为“键值对(key-value)”数组,键(key)也即字符串形式的数组下标,值(value)也即元素值。

declare -A arr_name

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

2、使用

2.1、定义数组实例

1、使用行内“索引-值”进行赋值

arr_name=([index1]=val1 [index2]=val2)

实例

declare -A Allstar=(["KOBE"]="24", ["GIGI"]="2", ["Lebron"]="23")

2、使用独立的”索引-值“进行赋值

arr_name[index1]=val1
arr_name[index2]=val2

实例

declare -A Allstar
Allstar["KOBE"]="24"
Allstar["GIGI"]="2"
Allstar["Lebron"]="23"

2.2、获取数组元素以及所有元素的下标和值

array_name["index"]

加上$()即可获取数组元素的值:

$(array_name["index"])
declare -A Allstar
Allstar["KOBE"]="24"
echo $(Allstar["KOBE"])

获取所有元素的下标和值
使用下面的形式可以获得关联数组的所有元素值:

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

使用下面的形式可以获取关联数组的所有下标值

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

2.3、数组长度

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

2.4、关联数组实例

#!/bin/bash

declare -A Allstar
Allstar["KOBE"]="24"
Allstar["GIGI"]="2"
Allstar["Lebron"]="23"

#获取所有元素值
for value in ${Allstar[*]}
do
    echo $value
done
echo "****************"
#获取所有元素下标(键)
for key in ${!Allstar[*]}
do

    echo $key
done
echo "****************"
#列出所有键值对
for key in ${!Allstar[@]}
do
    echo "${key} -> ${Allstar[$key]}"
done

输出结果如下:

2
23
24
****************
GIGI
Lebron
KOBE
****************
GIGI -> 2
Lebron -> 23
KOBE -> 24

在这里插入图片描述

参考

1、http://c.biancheng.net/view/810.html
2、http://c.biancheng.net/view/3009.html

猜你喜欢

转载自blog.csdn.net/JMW1407/article/details/107457932