欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。

教程  Shell&Shell脚本基础教程——数组

Shell 本站 1198 0评论

和其他编程语言一样,Shell 也支持数组。数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。

Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。和C语言类似,Shell 数组元素的下标也是从 0 开始计数。

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

遗憾的是,常用的 Bash Shell 只支持一维数组,不支持多维数组。


Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

数组名=(值1 值2 ... 值n)

array_name=(value1 ... valuen)


例如:

array_name=(value0 value1 value2 value3)

或者:

array_name=(

value0

value1

value2

value3

)

还可以单独定义数组中的各个元素:

array_name[0]=value0

array_name[1]=value1

......

array_name[n]=valuen


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

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

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


字符串类型数组:同样,使用一对括号表示数组,其中数组中的元素使用双引号或者单引号包含,同样使用“空格”来隔开。

rr_string=("abc" "edf" "sss"); 或者 arr_string=('abc' 'edf' 'sss');


一、数组的操作


定义了数组之后就要开始使用了,首先就是读取。


1.读取数组元素


读取数组元素值的一般格式是:

${数组名[下标]}

${array_name[index]}


例如:

valuen=${array_name[n]}


n=${nums[2]}

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

echo ${nums[3]}

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


使用@或*可以获取数组中的所有元素,例如:

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

两者都可以得到 nums 数组的所有元素。


实例:

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

运行结果:

29 100 13 8 91 44

29 100 13 8 91 44 66

91


2.获取数组长度


所谓数组长度,就是数组元素的个数。

利用@或*,可以将数组扩展成列表,然后使用#来获取数组元素的个数,格式如下:

${#array_name[@]}

${#array_name[*]}

其中 array_name 表示数组名。两种形式是等价的,选择其一即可。


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

${#arr[2]}

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


回忆字符串长度的获取

回想一下 Shell 是如何获取字符串长度的呢?其实和获取数组长度如出一辙,它的格式如下:

${#string_name}

string_name 是字符串名。


实例:

#!/bin/bash
nums=(29 100 13)
echo ${#nums[*]}
#向数组中添加元素
nums[10]="http://c.biancheng.net/shell/"
echo ${#nums[@]}
echo ${#nums[10]}
#删除数组元素
unset nums[1]
echo ${#nums[*]}

运行结果:

3

4

29

3


获取数组的下标:

length=${!array_name[@]}

#或

length=${!array_name[*]}

例如:

arr=(10 20 30 100 50 60)
echo ${!arr[@]}

运行结果:

0 1 2 3 4 5


3.赋值


格式:数组名[下标]=值,如果下标不存在,则新增数组元素; 下标已有,则覆盖值

arr_number=(1 2 3 4 5);


这里需要提出两个问题:

第一个问题是如果该下标元素已经存在,会怎么样?

答:会修改该下标的值为新的指定值。

例如:arr_number[2]=100,数组被修改为(1 2 100 4 5)


第二个问题是如果指定的下标已经超过当前数组的大小,如上述的arr_number的大小为5,指定下标为10或者11或者大于5的任意值会如何?

答:新赋的值被追加到数组的尾部。

例如:arr_number[13]=13,数组被修改为(1 2 100 4 5 13)


4.分片访问


格式:${数组名[*或@]:开始下标:长度},截取部分数组,返回字符串,中间用空格分隔;将结果使用“()”,则得到新的切片数组

例如:

[root@10 ~]# arr2=(-1 2 3 4 5 6 7)
[root@10 ~]# echo ${arr2[*]:0:3}
-1 2 3
[root@10 ~]# arr3=(${arr2[*]:0:3}) #赋值给新的数组
[root@10 ~]# echo ${arr3[*]}
-1 2 3


5.替换元素


格式:${数组名[*或@]/查找字符/替换字符}, 不会修改原数组;如需修改的数组,将结果使用“()”赋给新数组

例如:

[root@10 ~]# echo ${arr2[*]}     
-1 2 3 4 5 6 7
[root@10 ~]# echo ${arr2[*]/7/10}
-1 2 3 4 5 6 10
[root@10 ~]# arr4=(${arr2[*]/7/10}) #赋值给新的数组
[root@10 ~]# echo ${arr4[*]}
-1 2 3 4 5 6 10


6.数组拼接、合并


所谓 Shell 数组拼接(数组合并),就是将两个数组连接成一个数组。

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

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

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


下面是完整的演示代码:

#!/bin/bash
array1=(23 56)
array2=(99 "http://c.biancheng.net/shell/")
array_new=(${array1[@]} ${array2[*]})
echo ${array_new[@]}  #也可以写作 ${array_new[*]}

运行结果:

23 56 99 http://c.biancheng.net/shell/


7.删除数组元素(也可以删除整个数组)


在 Shell 中,使用 unset 关键字来删除数组元素,具体格式如下:

unset array_name[index]

其中,array_name 表示数组名,index 表示数组下标。


如果不写下标,而是写成下面的形式:

unset array_name

那么就是删除整个数组,所有元素都会消失。


下面我们通过具体的代码来演示:

#!/bin/bash
arr=(23 56 99 "http://c.biancheng.net/shell/")
unset arr[1]
echo ${arr[@]}
unset arr
echo ${arr[*]}

运行结果:

23 99 http://c.biancheng.net/shell/

空行


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


8.数组遍历


arr=(1 2 3 4 5) 


1)遍历(For循环法):

for var in ${arr[@]};
do
    echo $var
done

运行结果:

1

2

3

4

5

 

2)遍历(带数组下标):

for i in "${!arr[@]}"; 
do 
    printf "%s\t%s\n" "$i" "${arr[$i]}"
done

运行结果:

01

12

23

34

45


3)遍历(While循环法):

j=0
while [ $j -lt ${#arr[@]} ]
do
  echo ${arr[$j]}
  let j++
done


遍历(While循环法)使用 let "n++ "自增: 多了双引号,其实不用也可以

n=0
while [ $n -lt ${#arr[@]} ]
do
  echo ${arr[$n]}
  let "n++"
done


9.向函数传递数组


由于Shell对数组的支持并不号,所以这是一个比较麻烦的问题。

翻看了很多StackOverFlow的帖子,除了全局变量外,无完美解法。

这里提供一个变通的思路,我们可以在调用函数前,将数组转化为字符串。

在函数中,读取字符串,并且分为数组,达到目的。

例如:

fun() {
    local _arr=(`echo $1 | cut -d " "  --output-delimiter=" " -f 1-`)
    local _n_arr=${#_arr[@]}
    for((i=0;i<$_n_arr;i++));
    do  
       elem=${_arr[$i]}
       echo "$i : $elem"
    done; 
}
 
array=(a b c)
fun "$(echo ${array[@]})"

运行结果:

0 : a

1 : b

2 : c


二、笔记


1.数组的值也可以写入变量。

例如:

A=1
my_array=($A B C D)
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

输出为:

第一个元素为: 1第二个元素为: B第三个元素为: c第四个元素为: D


2.根据数组元素索引获取该数组元素值时,数组下标可为变量。

例如:

arr=(a b c d)
i=2
echo ${arr[i]}

输出为:

c


参考网址:

https://www.cnblogs.com/boshen-hzb/p/6249049.html 

http://www.runoob.com/linux/linux-shell-array.html 

http://c.biancheng.net/view/810.html 


转载请注明: ITTXX.CN--分享互联网 » Shell&Shell脚本基础教程——数组

最后更新:2018-12-21 13:36:49

赞 (0) or 分享 ()
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽