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[*]$
程序执行
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 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) Output arr=() 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”