📜  Bash 脚本 - 数组

📅  最后修改于: 2022-05-13 01:57:28.398000             🧑  作者: Mango

Bash 脚本 - 数组

数组是编程或脚本中的重要概念。数组允许我们以可用于某些任务的列表形式存储和检索元素。在 bash 中,我们还有数组可以帮助我们在命令行中创建脚本,以列表格式存储数据。在本文中,我们将了解 bash 脚本中数组的基础知识。

创建数组

要在 bash 脚本中创建基本数组,我们可以使用 declare -a命令,后跟您要提供的数组变量的名称。

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

或者

#!/bin/usr/env bash

sport[0]=football
sport[1]=cricket
sport[2]=hockey
sport[3]=basketball

根据需要,元素的值可以是任何整数或字符串或任何其他形式的数据。我们可以看到,数组在 bash 脚本中以两种方式声明,前者似乎更方便且不那么繁琐。如果我们想一次性声明数组,前者是最佳选择,但如果要逐个添加元素,则后者是一个不错的选择。

打印数组

声明数组后,如果我们想显示数组中的所有元素,可以使用@符号。

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

echo "${sport[@]}"

echo "${array_name[@]}"  

我们使用 [@] 作为数组的索引来显示所有元素。所有元素都以空格分隔打印,变量周围的引号展开并打印数组中的所有元素。

遍历数组

要一次遍历一个数组元素,我们可以使用循环并在其主体内执行任何操作。

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

for i in ${nums[@]}
do
echo -e "$i \n"
done

正如我们所看到的,我们使用了一个 for 循环来逐个打印数组中的元素。我们在上一节中使用了获取数组的所有元素并在 for 循环中逐个迭代它的技巧。 “${array_name[@]}” 扩展为数组中的所有元素,for 循环使用迭代器一一迭代它们,在示例中它是变量 i ,在 for 循环的主体内,我们打印变量/迭代器 i并因此迭代数组。

获取Array中的元素个数

要获取元素数组的数量,我们可以在“${array_name[@]}”中的 s 中的数组名称之前使用 #运算符。

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

echo "${#sport[@]}"

因此,我们使用命令“${#sport[@]}”返回数组的大小, # 用于获取它旁边的变量的大小,使用双引号计算命令的值并我们根据需要获得数组中元素的数量。

将元素插入数组

插入一个元素非常简单,我们需要设置元素的适当索引,然后是您想要给出的元素的值。

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

echo "${sport[@]}"

sport[4]="dodgeball"
sport[2]="golf"

echo "${sport[@]}"

我们已将第 5 个元素(第 4 个索引)添加到数组中,并修改/编辑了数组的第 3 个元素(第 2 个索引)。 arrayname[index]=value是添加、修改或初始化数组元素的所有技巧。

我们还可以使用 +=运算符将元素添加到数组中。

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

echo "${sport[@]}"
sport+=("golf" "baseball")
echo "${sport[@]}"
echo "Size : ${#sport[@]}"

如示例所示,我们可以用最少的代码向数组中添加多个元素。我们使用 array_name+=(elements) 将元素附加到数组中。

从数组中删除一个元素

要从数组中删除一个元素,我们可以使用命令 unset。在我们的例子中,该命令接受变量的名称,即数组名称和该元素的索引。索引也可以是相对的,即 -1 表示最后一个元素,-2 表示倒数第二个,依此类推。

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

unset sport[1]
echo "${sport[@]}" 
echo "${#sport[@]}" 

我们可以看到 unset arrayname[index] 将从数组中删除索引处的元素。此外,数组的大小已从 4 减少到 3,这表明该元素已被完全删除,而不仅仅是替换为空白。

使用相对索引

如果我们使用 -1、-2 等索引,则元素是从最后一个元素引用的,因此我们也可以从后面按照相对顺序删除或修改它们。

#!/bin/usr/env bash

declare -a sport=(
[0]=football
[1]=cricket
[2]=hockey
[3]=basketball
)

unset sport[-3]
echo "${sport[@]}"

正如我们所见,索引 1 从后面也被称为 -3,因此在大型数组中引用某些元素变得相对容易。

拼接一个数组

我们可以拼接(取出药水)一个数组来赋值或打印到另一个变量/数组。

#!/bin/usr/env bash

declare -a sport

sport+=("football" "cricket" "hockey" "basketball")
sport+=("golf" "baseball")

echo "sport = ${sport[@]}"
arr="${sport[@]:1:3}"
echo "arr = ${arr[@]}"

我们从运动数组中取出一个块,即索引 1 和 3 之间的元素,并将其分配给也是一个数组的 arr 变量。 @运算符从数组中获取所有元素,然后我们可以在索引 1 和 3 之间拼接数组,以便我们从运动数组中获得 1,2 和 3 处的元素(板球、曲棍球和棒球)。

定义一个静态数组并打印数组的元素

#To declare static Array
programmingArray=(Java Python Ruby Perl)

#In below 2 ways we can print the elements of the static array
echo "Way 1 of printing static values by using [@]:0 - " ${programmingarray[@]$
echo "Way 2 of printing static values by using [*]:0 - " ${programmingarray[*]$

在2种方式中,我们可以打印静态数组的元素

程序执行

sh 

So, we can give as

sh arraycheck2.sh # arraycheck2.sh is the name of the script file here

在脚本文件中传递命令行参数

#All the array elements are stored in an array called programmingArray
programmingArray=("$@")
#Index values start from 0

#If we do not specify the index, it will take up the size of first index value
echo "Size of programmingArray at 0th location..:" $(#programmingArray[0]}

echo "Size of programmingArray at 1st location..:" $(#programmingArray[1]}

上面的脚本可以执行为

# 这里Java、 Python和 Ruby 是命令行参数

sh arrayCheck.sh  Java Python Ruby  

脚本执行步骤:

ProgrammingArray=(Java Python Ruby)

# Java将出现在第 0 个索引处,其大小可以通过以下方式计算

${#programmingArray[0]}

同样, Python将出现在第一个索引处,它的大小可以通过以下方式计算

${#programmingArray[1]}

输出:

使用 for 循环迭代数组值

$@ 将给出通过命令行参数传递的所有值,并将其存储在一个数组中。

它可以通过使用“for”循环进行迭代

declare -a programmingArray=("$@")

i=0

for programming in "$@"

do

  echo "Array value at index " $i " : " $programming

  i=$((i+1));

done 

输出:

让我们快速浏览一下每个符号代表什么

Syntax

  

Output
arr=()

arr[0]=3 Overwrite 1st element

arr+=(4) Append value(s)

str=$(ls) Save ls output as a string

arr=( $(ls) ) Save ls output as an array of files

${arr[@]:s:n} Retrieve n elements starting at index

#We can provide set of values

like this

arr=(one two three) 

To initialize an array
${arr[0]}To retrieve the first element. Always index starts with 0
${arr[@]} To retrieve all elements and thereupon we can iterate in a loop
${!arr[@]} To retrieve array indices alone
${#arr[@]} To calculate the size of an array
arr[2]=3 To overwrite 3rd element we need to use it this way. As the index starts at 0, arr[2] is correct.
arr+=(40) To append value(s), we can use + and then assign with = and hence += is used.
str=$(ls) To save “ls” command  output as a string(Example 4 is shown for this output)
arr=( $(ls) )To save “ls” output as an array of files(Example 5 is shown for this output)
${arr[@]:s:n} To retrieve “n” elements starting at index “s”