Bash数组

Bash数组

在小节中,我们将学习bash数组的基础知识以及如何在bash shell脚本中使用。

数组可以定义为相似类型元素的集合。与大多数编程语言不同,bash脚本中的数组不必是相似类型元素的集合。由于Bash不能将字符串与数字区分开,因此数组可以同时包含字符串和数字。

Bash不支持多维数组,Bash支持一维数字索引数组以及关联数组。要从最后一个访问数字索引数组,可以使用负索引。索引-1是最后一个元素的参考。可以在数组中使用几个元素。

1. Bash数组声明

Bash中的数组可以通过以下方式声明:

1.1. 创建数字索引数组

可以使用任何变量作为已经索引的数组,而无需声明它。

使用关键字declare将变量显式声明为Bash数组,并且语法可以定义为:

declare -a ARRAY_NAME

其中,
ARRAY_NAME表示分配给数组的名称。

注意:在Bash中命名变量的规则与命名数组相同。

创建索引数组的一般方法可以按以下形式定义:

ARRAY_NAME[index_1]=value_1  
ARRAY_NAME[index_2]=value_2  
ARRAY_NAME[index_n]=value_n

其中关键字index用于定义正整数。

1.2. 创建关联数组

与数字索引数组不同,关联数组需要首先声明。可以使用关键字declare-A(大写)选项来声明关联数组。语法定义为:

declare -A ARRAY_NAME

创建关联数组的通用方法可以按以下形式定义:

declare -A ARRAY_NAME  
ARRAY_NAME[index_foo]=value_foo  
ARRAY_NAME[index_bar]=value_bar  
ARRAY_NAME[index_xyz]=value_xyz

其中index_用于定义任何字符串。

还可以通过以下方式编写以上形式:

declare -A ARRAY_NAME  

ARRAY_NAME=(  
    [index_foo]=value_foo  
    [index_bar]=value_bar  
    [index_xyz]=value_xyz  
)

1.3. Bash数组初始化

要初始化Bash数组,可以使用赋值运算符(=),方法是指定括号内的元素列表,并用空格分隔,如下所示:

ARRAY_NAME=(element_1st element_2nd element_Nth)

注意:此处,第一个元素的索引为0。此外,赋值运算符(=)周围不应有空格。

1.4. Bash数组的访问元素

要访问Bash数组的元素,可以使用以下语法:

echo ${ARRAY_NAME[2]}

Bash打印数组

可以使用-p选项的关键字declare来打印带有所有索引和详细信息的Bash数组的所有元素。打印Bash数组的语法为:

declare -p ARRAY_NAME

2. 数组运算

分配数组后,可以对其执行一些有用的操作。可以显示键和值,也可以通过添加或删除元素来对数组进行修改:

2.1. 引用元素

要引用单个元素,首先需要知道元素的索引号。可以使用以下语法引用或打印任何元素:

${ARRAY_NAME[index]}

注意:需要使用花括号${}来避免shell的文件名扩展运算符。

例如,打印一个索引为2的数组元素,参考Bash脚本:

#!/bin/bash  
#Script to print an element of an array with an index of 2  

#declaring the array  
declare -a example_array=( "Welcome" "To" "zyiz" )  

#printing the element with index of 2  
echo ${example_array[2]}

执行上面示例代码,得到以下结果:

如果在指定的索引位置使用@*,它将扩展到数组的所有成员。要打印所有元素,可以使用以下形式:

#!/bin/bash  
#Script to print all the elements of the array  

#declaring the array  
declare -a example_array=( "Welcome" "To" "zyiz" )  

#Printing all the elements  
echo "${example_array[@]}"

执行上面示例代码,得到以下结果:

Welcome To zyiz

使用@*之间的唯一区别是,使用@时,需要使用双引号引起来。在第一种情况下(使用@时),扩展为数组的每个元素提供了一个单词的结果。可以使用for循环更好地描述它。假设有一个包含三个元素的数组:”Welcome” “To” 和 “zyiz”,如下所示:

$example_array= (Welcome to zyiz)

那么使用@循环为:

for i in "${example_array[@]}"; do echo "$i"; done

执行上面示例代码,得到以下结果:

Welcome
To
zyiz

应用带有*的循环将产生单个结果,将数组的所有元素都保存为一个单词:

Welcome To zyiz

了解@*的用法很重要,因为在使用表单迭代数组元素时,它很有用。

2.2. 打印数组的键

还可以检索和打印在索引或关联数组中使用的键(而不是它们各自的值)。可以通过添加!来执行。数组名称前的运算符如下:

${!ARRAY_NAME[index]}

示例:

#!/bin/bash  
#Script to print the keys of the array  

#Declaring the Array  
declare -a example_array=( "Welcome" "To" "zyiz" )  

#Printing the Keys  
echo "${!example_array[@]}"

执行上面示例代码,得到以下结果:

0  1  2

2.3. 查找数组长度

可以使用以下形式来计算数组中包含的元素数:

${#ARRAY_NAME[@]}

示例

#!/bin/bash  

#Declaring the Array  
declare -a example_array=( "Welcome" "To" "zyiz" )  

#Printing Array Length  
echo "The array contains ${#example_array[@]} elements"

执行上面示例代码,得到以下结果:

The array contains 3 elements

2.4. 遍历数组

遍历数组中每个项目(元素)的通用方法是使用for循环。

示例

#!/bin/bash  
#Script to print all keys and values using loop through the array  

declare -a example_array=( "Welcome" "To" "zyiz" )  

#Array Loop  
for i in "${!example_array[@]}"  
do  
echo The key value of element "${example_array[$i]}" is "$i"  
done

执行上面示例代码,得到以下结果:
遍历数组

循环遍历数组的另一种常见方法是根据数组的长度并使用C语言样式的循环,如下示例代码:

#!/bin/bash  
#Script to loop through an array in C-style  

declare -a example_array=( "Welcome" "To" "zyiz" )  

#Length of the Array  
length=${#example_array[@]}  

#Array Loop  
for (( i=0; i < ${length}; i++ ))  
do   
echo $i ${example_array[$i]}  
done

2.5. 将元素添加到数组

可以选择通过分别指定元素的索引或关联键将元素添加到索引或关联数组。要将新元素添加到bash中的数组中,可以使用以下形式:

ARRAY_NAME[index_n]="New Element"

示例

#!/bin/bash  

#Declaring an array  
declare -a example_array=( "Java" "Python" "PHP" "HTML" )  

#Adding new element  
example_array[4]="JavaScript"  

#Printing all the elements  
echo "${example_array[@]}"

执行上面示例代码,得到以下结果:

Java Python PHP HTML JavaScript

向数组添加新元素的另一种方法是使用+=运算符。无需在此方法中指定索引。使用以下方式在数组中添加一个或多个元素:

示例代码:

#!/bin/bash  

#Declaring the Array  
declare -a example_array=( "Java""Python""PHP" )  

#Adding new elements  
example_array+=( JavaScript CSS SQL )  

#Printing all the elements  
echo "${example_array[@]}"

执行上面示例代码,得到以下结果:

Java Python PHP JavaScript CSS SQL

2.6. 更新数组元素

可以通过按索引值为现有数组分配新值来更新数组元素。下面将使用值zyiz更改索引4处的数组元素。

示例

#!/bin/bash  
#Script to update array element  

#Declaring the array  
declare -a example_array=( "We" "welcome" "you" "on" "nxtutor.com" )  

#Updating the Array Element  
example_array[4]=zyiz  

#Printig all the elements of the Array  
echo ${example_array[@]}

执行上面示例代码,得到以下结果:

We welcome you on nxtutor.com

2.7. 从数组中删除元素

如果要从数组中删除元素,则在关联数组的情况下必须知道其索引或键。可以使用unset命令删除元素:

unset ARRAY_NAME[index]

参考下面示例代码以更好地理解此概念:

#!/bin/bash  
#Script to delete the element from the array  

#Declaring the array  
declare -a example_array=( "Java" "Python" "HTML" "CSS" "JavaScript" )  

#Removing the element  
unset example_array[1]  

#Printing all the elements after deletion  
echo "${example_array[@]}"

执行上面示例代码,得到以下结果:

Java HTML CSS JavaScript

在上面示例中,创建了一个简单的数组,其中包含五个元素:"Java""Python""HTML""CSS""JavaScript"。然后,使用unset并引用其索引从数组中删除了Python元素。元素Python的索引为1,因为bash数组从0开始。如果在删除元素后查看数组的索引,应该会看到所删除元素的索引丢失了。通过在脚本中添加以下命令来检查索引:

echo ${!example_array[@]}

执行上面示例代码,得到以下结果:

0 2 3 4

这个概念也适用于关联数组。

2.8. 删除整个数组

删除整个数组是一个非常简单的任务。可以通过将数组名称作为参数传递给unset命令来执行,而无需指定索引或键。如下示例代码:

#!/bin/bash  
#Script to delete the entire Array  

#Declaring the Array  
declare -a example_array=( "Java" "Python" "HTML" "CSS" "JavaScript" )  

#Deleting Entire Array  
unset example_array  

#Printing the Array Elements  
echo ${!example_array[@]}  

#Printing the keys  
echo ${!example_array[@]}

执行上面示例代码,得到以下结果:

0 2 3 4

如果打印上述脚本的内容将不会有输出。返回空结果,因为数组不再存在。

2.9. 切片数组元素

Bash数组也可以从给定的起始索引切到结束索引。要将数组从起始索引m切到结束索引n,可以使用以下语法:

SLICED_ARRAY=(${ARRAY_NAME[@]:m:n}")

示例代码

#!/bin/bash  
#Script to slice Array Element from index 1 to index 3  

#Declaring the Array  
example_array=( "Java" "Python" "HTML" "CSS" "JavaScript" )  

#Slicing the Array   
sliced_array=("${example_array[@]:1:3}")  

#Applying for loop to iterate over each element in Array  
for i in "${sliced_array[@]}"  
do  
echo $i  
done

执行上面示例代码,得到以下结果: