bash数组
数组是最常用的基本数据结构之一。
我们可以认为数组是一个可以其中存储多个变量的变量。
在本文中,我们将介绍Bash数组,并说明如何在Bash脚本中使用它们。
bash数组
Bash支持一维数字索引和关联数组类型。
数字数组是使用整数引用的,而关联数组是使用字符串引用的。
可以使用负索引从末尾访问数字索引数组,索引“ -1”引用最后一个元素。
索引不必是连续的。
与大多数编程语言不同,Bash数组元素不必具有相同的数据类型。
我们可以创建一个同时包含字符串和数字的数组。
Bash不支持多维数组,因此我们不能同时使用数组元素。
数组中可以存储的最大元素数没有限制。
创建Bash数组
Bash中的数组可以用不同的方式初始化。
创建数字索引数组
Bash变量是无类型的,任何变量都可以在不声明的情况下用作索引数组。
要显式声明一个数组,请使用内置的声明:
declare -a array_name
创建索引数组的一种方法是使用以下形式:
array_name[index_1]=value_1 array_name[index_2]=value_2 array_name[index_n]=value_n
其中“ index_ *”是一个正整数。
创建数字数组的另一种方法是在括号内指定元素列表,并用空格隔开:
array_name=( element_1 element_2 element_N )
使用上面的形式创建数组时,索引从零开始,例如:第一个元素的索引为'0'。
创建关联数组
与数字索引不同,必须在使用关联数组之前对其进行声明。
要声明一个关联数组,请使用带有“ -A”(大写)选项的内置“ declare”:
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[index]}
访问数组元素的语法类似于大多数编程语言的语法。
必须使用大括号“ ${}”来避免shell的文件名扩展运算符。
让我们打印索引为“ 1”的元素:
## declare the array declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## print element echo ${my_array[1]}
Helium
如果使用“ @”或者“ *”作为索引,则单词将扩展为数组的所有成员。
要打印所有元素,请使用:
## declare the array declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## print all elements echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium
“ @”和“ *”之间的唯一区别是,格式“ ${my_array [x]}”用双引号引起来。
在这种情况下,“ *”扩展为单个单词,其中数组元素之间用空格分隔。
“ @”将每个数组元素扩展为一个单独的单词。
当使用表格对数组元素进行识字时,这一点尤其重要。
要打印数组的键,请添加“!”数组名称前的运算符:
${!array_name[index]}
这是一个例子:
## declare the array declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## print all elements echo "${!my_array[@]}"
0 1 2 3
数组的长度
要获取数组的长度,请使用以下形式:
${#array_name[@]}
语法与引用所有元素时相同,只是在数组名称前添加了“#”字符。
## declare the array declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## array Length echo ${#my_array[@]}
4
遍历数组
遍历数组中每个项目的最常见方法是使用for循环:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## Array Loop for i in "${my_array[@]}" do echo "$i" done
上面的代码将遍历数组,并在新行中打印每个元素:
Hydrogen Helium Lithium Beryllium
这是如何打印所有键和值的示例:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## Array Loop for i in "${!my_array[@]}" do echo "$i" "${my_array[$i]}" done
0 Hydrogen 1 Helium 2 Lithium 3 Beryllium
遍历数组的另一种方法是获取数组的长度并使用“ C样式”循环:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) # Length of the array length=${#my_array[@]} # Array Loop for (( i=0; i < ${length}; i++ )) do echo $i ${my_array[$i]} done
0 Hydrogen 1 Helium 2 Lithium 3 Beryllium
bash添加一个新元素到数组中
要将新元素添加到bash数组并指定其索引,请使用以下形式:
my_array[index_n]="New Element"
这是一个例子:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## add new element my_array[9]="Aluminum" ## print all elements echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Aluminum
在不指定索引的情况下将新元素添加到数组的另一种方法是使用'+ ='运算符。
我们可以添加一个或者多个元素:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## add new elements my_array+=( Cobalt Nickel ) ## print all elements echo "${my_array[@]}"
Hydrogen Helium Lithium Beryllium Cobalt Nickel
bash删除数组中的元素
要删除单个元素,我们需要知道元素索引。
可以使用'unset'命令删除一个元素:
unset my_array[index]
让我们来看一个例子:
declare -a my_array=( "Hydrogen" "Helium" "Lithium" "Beryllium" ) ## remove element unset my_array[2] ## print all elements echo "${my_array[@]}"
Hydrogen Helium Beryllium