shell中的数组

shell中的数组


shell作为一门语言那肯定是不能缺少数组了,下面记录了shell中数组的一些相关内容。

Bash 提供了一维数组变量。任何变量都可以作为一个数组;内建命令 declare 可以显式地定义数组。数组的大小没有上限,也没有限制在连续对成员引用和赋值时有什么要求。数组以整数为下标,从 0 开始。

1. 定义和初始化数组

下面的示例总结了如何定义一个数组和如何来初始化数组:

declare -a array #显示声明了数组array
delcare -a array[10] #数组大小没有上限,所以定义时指定的大小会被忽略
array[key]=value #array[0]=one,array[1]=two
array=(value1 value2...) #value的形式都是[subscript]=string,下标和等号可以省略,示例如下。
array=(value1 value2 value3) #array[0]=value1,array[1]=value2,array[2]=value3
array=([0]=value1 [2]=value3 [3]=value[4])

从上面来看数组的定义也是非常灵活多变的,能够满足我们大部分的需求,跟其其它语言最大的区别就是shell中的数组大小没有上限,也可以理解为数组是动态的。

2. 数组的访问

数组的任何元素都可以用${array[subscript]}来引用,花括号是必须的,以避免和路径扩展冲突。
如果 subscript 是@或是*,它扩展为array的所有成员。这两种下标只有在双引号中才不同。在双引号中,${name[*]}扩展为一个词,由所有数组成员的值组成,用特殊变量IFS的第一个字符分隔数组成员;${array[@]}将array的每个成员扩展为一个词。 如果数组没有成员,${name[@]} 扩展为空串。

#!/bin/bash

arr=("one" "two")
for i in "${arr[*]}"
do
    echo ${i}
done

上面的示例代码的输出结果如下:

lxg@lxg-X240:~/station/shell$ sh ./array.sh
one two

#!/bin/bash

arr=("one" "two")
for i in "${arr[@]}"
do
    echo ${i}
done

上面的示例代码的输出结果如下:

lxg@lxg-X240:~/station/shell$ sh ./array.sh
one
two

3. 数组的删除

用unset来进行数组的删除,示例如下:

unset array[2] #删除第三个成员
unset array #删除整个数组

4. 数组的长度

${#arr[@]}
${#arr[*]}
${#arr} #错误的。这个获取的是数组第一个成员的长度。

5. 数组的”切片”操作

获取数组的“子串“用${arr[@]:n:m}来表示,如果没有:m那么就获取从下标n开始到最后一个元素的“字串“,示例如下:

#!/bin/bash

echo ${arr[@]:2}
echo ${arr[@]:1:3}
echo ${arr[@]:0}

输出如下:

three four
two three four
oner two three four

6. 关联数组

shell中还可以声明一个关联数组,普通数组只能使用整数作为数组的索引,而关联数组则使用字符串作为数组的索引。这个关联数组是不是有点其它语言中的字典的意思呢,o(∩∩)o…哈哈

#!/bin/bash

declare -A ass_arr
ass_arr["apple"]=12
ass_arr["orange"]=19

for t in "${ass_arr[@]}"
do
    echo ${t}
done

echo "ass_arr[\"orange\"]="${ass_arr["orange"]}

上面的示例输出如下:

19
12
ass_arr[“orange”]=19

从上面的输出来看关联数组输出的顺序跟普通数组有一些不同,关联数组是从最后一个成员开始输出。
关联数组使用字符串作为索引,有时候我们需要获取数组的所有索引,可以用如下的方式来获取:

#!/bin/bash

declare -A ass_arr
ass_arr["apple"]=12
ass_arr["orange"]=19

echo ${!ass_arr[@]} #or ${!ass_arr[*]}

输出如下:

apple orange

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值