你了解如何使用Bash的数组吗?

2021-09-03 11:48:27 浏览数 (1)

之前使用Shell编程很少使用到数组,最近尝试使用后发现它在某些情况下非常有用。这里简单介绍如何生成和使用数组。

生成数组

我们只要将一组空格分隔的序列用括号括起来,就生成了一个数组。

代码语言:javascript复制
array=(a b c d e f g)

使用数组

输出数组

使用{array[*]}或{array[@]}输出全部元素:

代码语言:javascript复制
bash-3.2$ echo ${array[*]}
a b c d e f g
bash-3.2$ echo ${array[@]}
a b c d e f g

array前加#输出元素个数:

代码语言:javascript复制
bash-3.2$ echo ${#array[*]}
7

获取元素将*改成索引,记得是从0开始:

代码语言:javascript复制
bash-3.2$ echo ${array[1]}
b
bash-3.2$ echo ${array[2]}
c

注意在非引用的情况下不需要美元符号和花括号,例如修改元素:

代码语言:javascript复制
bash-3.2$ array[2]=ff
bash-3.2$ echo ${array[2]}
ff

迭代数组:

代码语言:javascript复制
#for i in "${!array[@]}"; do 
#  printf "%st%sn" "$i" "${array[$i]}"
#done

bash-3.2$ for i in "${!array[@]}"; do 
>   printf "%st%sn" "$i" "${array[$i]}"
> done
0  a
1  b
2  ff
3  d
4  e
5  f
6  g

注意我们常用的序列生成命令seq并不会生成一个数组,哪怕你可以迭代它:

代码语言:javascript复制
bash-3.2$ echo `seq 1 10`
1 2 3 4 5 6 7 8 9 10
bash-3.2$ a2=`seq 1 10`
bash-3.2$ echo ${a2}
1 2 3 4 5 6 7 8 9 10
bash-3.2$ echo $a2
1 2 3 4 5 6 7 8 9 10
bash-3.2$ echo ${a2[1]}

bash-3.2$ echo ${a2[2]}

bash-3.2$ echo ${a2[0]}
1 2 3 4 5 6 7 8 9 10
bash-3.2$ for i in $a2; do echo $i; done
1
2
3
4
5
6
7
8
9
10

下一节我们再看如何转换。

数据处理中利用数组

如果你有一定的数据分析经验,会比较容易发现上面的知识并不能带来什么用处。在数据处理中使用数组,我们需要掌握一点技巧。

以可编程的方式引用数组元素

在实际处理时,我们一般不可能会手动地指定元素在所在数组中的索引。所以,我们需要一种办法做到。

其实也很简单,将索引直接用Shell变量替换即可:

代码语言:javascript复制
bash-3.2$ idx=2
bash-3.2$ echo ${array[$idx]}
ff

使用时一定要注意不同符号的位置关系。

序列转换为数组

我们先看看怎么将a2转换为数组。

将序列转换为数组,还是使用()

代码语言:javascript复制
bash-3.2$ echo $a2
1 2 3 4 5 6 7 8 9 10
bash-3.2$ a3=($a2)
bash-3.2$ echo $a3
1
bash-3.2$ echo ${#a2[*]}
1
bash-3.2$ echo ${#a3[*]}
10
bash-3.2$ echo ${a3[*]}
1 2 3 4 5 6 7 8 9 10

注意美元符两侧不要加引号。

这样我们就能够愉快地将命令生成的序列数组化,然后单个获取和操作其中的元素了:

代码语言:javascript复制
bash-3.2$ touch file{1..10}
bash-3.2$ files=(`ls file*`)
bash-3.2$ echo ${files[3]}
file3

0 人点赞