Linux平台上工作,经常需要使用shell来编写一些有用、有意义的脚本程序。

shell数组并不常用到,因为它仅支持弱类型的一维数组,但在某些情况下,它非常的有用。

那么,shell中的数组是怎么定义的呢?

 

1、数组的定义

学过计算机编程语言的同学都知道,数组的特性就是一组数据类型相同的集合(不包括有一些编程语言提出来的关联数组的概念)。那么shell中数组是怎么定义的呢,我们来看两种数据类型:一是数值类型,二是字符串类型;虽然shell本身是弱类型的,但也可以这么区分。

数值类型的数组:

arr_number=(1 2 3 4 5);

一对括号表示数组,数组中元素之间使用空格“ ”来隔开

 

字符串类型数组

arr_string=("abc" "efg" "xyz");

arr_string=('abc' 'efg' 'xyz');

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

 

2、数组的操作

使用数值类型数组arr_number=(1 2 3 4 5)做为源数组进行相关的讲解:获取数组长度,读取某个下标的值,对某个下标赋值,删除、分配和替换以及遍历。

提一个知识点,我们在shell里面想获取某个变量的值,使用$符开头,如:$a 或者 ${a} 即可。

 

2.1、获取数组长度

arr_length=${#arr_number[*]} 或 ${#arr_number[@]} 均可

形式:${#数组名[@/*]}  可得到数组的长度。

 

2.2、读取某个下标的值

形式:${数组名[下标]} ,下标从 0 开始

示例:arr_index2=${arr_number[2]}

$ arr=(1 2 3 4 5)
$ echo ${arr[0]}
1
$ echo ${arr[3]}
4

 

2.3、追加元素

因为shell 数组没有追加函数,所以利用数组的长度来追加元素,获取数组的长度:${#arr[*]}

arr[${#arr[*]}]=追加的元素

for var in ${arr[@]}
do
   echo "打印的内容:"$var
done

示例:

$ arr=(1 2 3 4 5)
$ echo ${arr[*]}
1 2 3 4 5
$
$ arr[${#arr[*]}]=6   # 末尾添加元素
$ echo ${arr[*]}   
1 2 3 4 5 6
$ echo ${arr[@]}   
1 2 3 4 5 6
$ arr[${#arr[*]}]=7   # 末尾添加元素
$ echo ${arr[@]}   
1 2 3 4 5 6 7

 

2.4、对某个下标赋值

这里需要提出两个问题:

第一个问题是

如果该下标元素已经存在,会怎么样?

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

例如: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)

 

2.5、删除操作

清除某个元素:unset arr_number[1],这里清除下标为1的数组;

清空整个数组:unset arr_number

 

2.6、分片访问

分片访问形式为:${数组名[@或*]:开始下标:结束下标},注意,不包括结束下标元素的值。

例如:${arr_number[@]:1:4},这里分片访问从下标为1开始,元素个数为4。

$ arr=(1 2 3 4 5)  
$ echo ${arr[@]:1:3}
2 3 4

 

2.7、模式替换

形式为:${数组名[@或*]/模式/新值}

例如:${arr_number[@]/2/98}

 

2.8、数组的遍历

数组遍历我们使用for语句来演示:

for v in ${arr_number[@]}; 
do
  echo $v;
done

 

应用范例1:

#!/bin/bash
#使用shell的冒泡排序
#a test about sort
echo "please input a number list"
read -a arrs
for((i=0;i<${#arrs[@]};i++)){
   for((j=0;j<${#arrs[@]}-1;j++)){
     if [[ ${arrs[j]} -gt ${arrs[j+1]} ]];then
          tmp=${arrs[j]}
          arrs[j]=${arrs[j+1]}
          arrs[j+1]=$tmp
      fi
}
}
echo "after sort"
echo ${arrs[@]}

 

应用范例2

$ cat test_2020.sh
#!/bin/bash
# 数组元素的累加

arr=(1 2 3 4 5 6 7 8 9)
sum=0
for num in ${arr[*]};
do
    sum=$num+$sum
done
echo "$sum" | bc

运行结果:

$ sh test_2020.sh 
45

 

结语

上述讲解了shell中的数组定义、获取长度、读取某下标值,对某个下标赋值,删除、分配和替换以及遍历。

并通过数组的方式实现了冒泡排序与元素的累加。

 

 

参考推荐:

shell 基础知识

shell命令curl 检测代理是否可用

Shell 提取文件路径中的文件名、后缀、目录 (推荐

Shell 参数含义 $0、$1、$2、${n}、$#、$@、$*、$?、 $_、$!、$$

Linux shell 局部变量与全局变量

Linux 之 shell 比较运算符

Linux Shell 函数返回值

Linux curl 命令模拟 POST/GET 请求

Linux Make(Makefile)由浅入深的学习与示例剖析

shell if语句 示例:文件或目录是否存在或有执行权限

linux实现两个文件内容相加

Linux cut 命令

linux 命令快捷键

Linux Shell 常用命令与目录分区

Linux shell 脚本通过expect实现自动输入密码

nohup、&、disown、setsid、screen、jobs 后台运行命令区别

cp、tar 命令排除文件和子目录

zip、tar 命令加密和解密压缩文件

Linux下tar、bz、gz等压缩包的压缩和解压