在小节中,我们将学习bash数组的基础知识以及如何在bash shell脚本中使用。
数组可以定义为相似类型元素的集合。与大多数编程语言不同,bash脚本中的数组不必是相似类型元素的集合。由于Bash不能将字符串与数字区分开,因此数组可以同时包含字符串和数字。
Bash不支持多维数组,Bash支持一维数字索引数组以及关联数组。要从最后一个访问数字索引数组,可以使用负索引。索引-1
是最后一个元素的参考。可以在数组中使用几个元素。
Bash中的数组可以通过以下方式声明:
可以使用任何变量作为已经索引的数组,而无需声明它。
使用关键字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
用于定义正整数。
与数字索引数组不同,关联数组需要首先声明。可以使用关键字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 )
要初始化Bash数组,可以使用赋值运算符(=
),方法是指定括号内的元素列表,并用空格分隔,如下所示:
ARRAY_NAME=(element_1st element_2nd element_Nth)
注意:此处,第一个元素的索引为
0
。此外,赋值运算符(=
)周围不应有空格。
要访问Bash数组的元素,可以使用以下语法:
echo ${ARRAY_NAME[2]}
Bash打印数组
可以使用-p
选项的关键字declare
来打印带有所有索引和详细信息的Bash数组的所有元素。打印Bash数组的语法为:
declare -p ARRAY_NAME
分配数组后,可以对其执行一些有用的操作。可以显示键和值,也可以通过添加或删除元素来对数组进行修改:
要引用单个元素,首先需要知道元素的索引号。可以使用以下语法引用或打印任何元素:
${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
了解@
和*
的用法很重要,因为在使用表单迭代数组元素时,它很有用。
还可以检索和打印在索引或关联数组中使用的键(而不是它们各自的值)。可以通过添加!
来执行。数组名称前的运算符如下:
${!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
可以使用以下形式来计算数组中包含的元素数:
${#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
遍历数组中每个项目(元素)的通用方法是使用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
可以选择通过分别指定元素的索引或关联键将元素添加到索引或关联数组。要将新元素添加到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
可以通过按索引值为现有数组分配新值来更新数组元素。下面将使用值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
如果要从数组中删除元素,则在关联数组的情况下必须知道其索引或键。可以使用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
这个概念也适用于关联数组。
删除整个数组是一个非常简单的任务。可以通过将数组名称作为参数传递给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
如果打印上述脚本的内容将不会有输出。返回空结果,因为数组不再存在。
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
执行上面示例代码,得到以下结果: