在Bash中使用数组

时间:2020-03-05 15:31:34  来源:igfitidea点击:

在Bash脚本中创建第一个数组

假设我们要创建一个Bash脚本时间戳.sh,以更新五个不同文件的时间戳。

首先,使用使用五种不同变量的天真方法:

#!/bin/bash
file1="f1.txt"
file2="f2.txt"
file3="f3.txt"
file4="f4.txt"
file5="f5.txt"
touch $file1
touch $file2
touch $file3
touch $file4
touch $file5

现在,而不是使用五个变量来存储五个文件名的值,而是创建一个包含所有文件名的数组,这是bash中的数组的常规语法:

array_name=(value1 value2 value3 … )

因此,现在我们可以创建一个名为文件的数组,该文件存储在时间戳.sh脚本中使用的所有五个文件名如下所示:

files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")

正如我们所看到的,这是更清晰,更高效,因为只需一个阵列更换了五个变量!

访问BASH中的数组元素

阵列的第一个元素以索引0开始,以便访问我们使用n -1索引的数组的第n个元素。

例如,要打印文件数组的第2元素的值,可以使用以下echo语句:

echo ${files[1]}

要打印文件数组的第3个元素的值,可以使用:

echo ${files[2]}

等等。

以下Bash脚本Reverse.sh将以反向顺序打印出文件阵列中的所有五个值,以上次数组元素开头:

#!/bin/bash
files=("f1.txt" "f2.txt" "f3.txt" "f4.txt" "f5.txt")
echo ${files[4]}
echo ${files[3]}
echo ${files[2]}
echo ${files[1]}
echo ${files[0]}

我知道你可能想知道为什么这么多的回声声明以及为什么我不在这里使用循环。
这是因为我打算在本系列后面介绍Bash循环概念。

我们还可以一次打印出所有数组元素:

echo ${files[*]}
f1.txt f2.txt f3.txt f4.txt f5.txt

我们可以打印文件数组元素的总数,例如:数组的大小:

echo ${#files[@]}
5

我们还可以更新数组的任何元素的值;例如,我们可以使用以下赋值将文件数组的第一个元素的值更改为"a.txt":

files[0]="a.txt"

在bash中添加数组元素

让我们创建一个包含流行Linux发行版名称的数组:

distros=("Ubuntu" "Red Hat" "Fedora")

发行版阵列电流包含三个元素。
我们可以使用+ =运算符将元素添加(添加)到数组的末尾。

例如,我们可以按如下方式将Kali添加到DistryIs数组:

distros+=("Kali")

现在,Distry array恰好包含具有Kali的四个数组元素,是数组的最后一个元素。

删除BASH中的数组元素

让我们首先创建一个数字,将从1到5存储的数字:

num=(1 2 3 4 5)

我们可以在NUM阵列中打印所有值:

echo ${num[*]}
1 2 3 4 5

我们可以使用"未设置"shell内置删除num阵列的3rdelement:

unset num[2]

现在,如果打印NUM阵列的所有值:

echo ${num[*]}
1 2 4 5

如我们所见,数组NUM的第三个元素已被删除。

我们还可以以相同的方式删除整个NUM阵列:

unset num

使用不同的数据类型创建混合阵列

在Bash中,与许多其他编程语言不同,我们可以创建包含不同数据类型的数组。
看看以下user.sh bash脚本:

#!/bin/bash
user=("john" 122 "sudo,developers" "bash")
echo "User Name: ${user[0]}"
echo "User ID: ${user[1]}"
echo "User Groups: ${user[2]}"
echo "User Shell: ${user[3]}"

注意用户数组包含四个元素:

  • "John"---->字符串数据类型
  • 122 --->整数数据类型
  • "sudo,开发人员"--->字符串数据类型
  • "bash"--->字符串数据类型

因此,它完全可以将不同的数据类型存储到同一数组中。