📜  Bash数组

📅  最后修改于: 2020-12-29 10:24:29             🧑  作者: Mango

重击数组

在本主题中,我们将演示bash数组的基础知识以及如何在bash shell脚本中使用它们。

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

Bash不支持多维数组。我们本身不能具有数组元素。 Bash支持一维数字索引数组以及关联数组。要从最后一个访问数字索引数组,我们可以使用负索引。索引“ -1”将被视为最后一个元素的参考。我们可以在数组中使用几个元素。

Bash数组声明

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

创建数字索引数组

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

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

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阵列初始化

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

ARRAY_NAME=(element_1st element_2nd element_Nth)

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

Bash数组的访问元素

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

echo ${ARRAY_NAME[2]}

打印Bash阵列

我们可以使用带有'-p'选项的关键字'declare'来print带有所有索引和详细信息的Bash数组的所有元素。printBash数组的语法可以定义为:

declare -p ARRAY_NAME

阵列运算

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

参考元素

要引用单个元素,我们需要知道该元素的索引号。我们可以使用以下语法引用或print任何元素:

${ARRAY_NAME[index]}

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

例如,让我们print一个索引为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""Javatpoint" )

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

输出量

Javatpoint

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

Bash脚本

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

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

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

输出量

Welcome to Javatpoint

使用@和*之间的唯一区别是,使用@时,表格用双引号引起来。在第一种情况下(使用@时),扩展为数组的每个元素提供了一个单词的结果。可以借助“ for循环”更好地描述它。假设我们有一个包含三个元素的数组:“欢迎”,“收件人”和“ Javatpoint”:

$ example_array= (Welcome to Javatpoint)

使用@循环:

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

它将产生以下结果:

Welcome
To
Javatpoint

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

Welcome To Javatpoint

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

打印阵列的键

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

${!ARRAY_NAME[index]}

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

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

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

输出量

0  1  2

查找数组长度

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

${#ARRAY_NAME[@]}

#!/bin/bash

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

#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""Javatpoint" )

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

输出量

遍历数组的另一种常见方法是检索数组的长度并使用C样式的循环:

Bash脚本

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

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

#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

更新数组元素

我们可以通过按索引值为现有数组分配新值来更新数组元素。让我们使用元素“ Javatpoint”更改索引4处的数组元素。

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

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

#Updating the Array Element
example_array[4]=Javatpoint

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

输出量

We welcome you on Javatpoint

从数组中删除元素

如果要从数组中删除元素,则在关联数组的情况下必须知道其索引或键。可以使用' 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[@]}

输出量

如果我们尝试print上述脚本的内容,将没有输出。因为该数组不再存在,所以返回空结果。

切片数组元素

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

输出量