zl程序教程

您现在的位置是:首页 >  其他

当前栏目

Bash 初学者系列 4:在 bash 中使用数组

2023-02-25 18:01:38 时间

在前面的文章中,我们介绍了如何在 bash 中使用有限数量的变量​,比如要保存一个或两个文件名或用户名。

但是,如果在 bash 脚本中需要多个变量,该怎么办?假设我们要创建一个 bash 脚本,从用户那里读取 100 个不同的输入,那么需要创建 100 个变量吗?

肯定不是这样,我们需要使用数组。

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

假设我们要创建一个名为 timestamp.sh 的脚本,用来更新 5 个不同文件的时间戳。

第一种使用比较原始的方法,创建 5 个不同的变量,如下所示:

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

可以看到这种方法写起来比较繁琐,我们还可以使用另一种方法,创建一个包含所有文件名的数组,如下语法:

array_name=(value1 value2 value3 … )

这种比较简洁,所以我们采用数组的方法,如下:

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

访问bash中的数组元素

与大多数编程语言中一样,数组中的元素索引是从 0 开始的,所以要访问数组中第 n 个元素,其下标索引应该是 [n - 1]

比如,要打印数组中的第 2 个元素,可以参考如下方式:

echo ${files[1]}

以下 bash 脚本 reverse.sh,将倒序打印数组中的 5 个元素:

#!/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 命令,而不是使用循环。我是想稍后在介绍 bash 中循环的使用。

也可以一次打印出所有数组元素:​

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

可以打印数组元素的总数,也就是数组的大小:​

echo ${#files[@]}
5

数组中元素的值是可以更改的。比如,我们可以用如下方式将数组中第一个元素的值改为 a.txt:

files[0]="a.txt"

向数组中添加元素

我们首先创建一个包含 Linux 版本名称的数组:

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

上述数组中包含三个元素。可以使用 += 运算符将元素添加(追加)到数组的末尾,如下所示:

distros+=("Kali")

现在,数组中已经有了 4 个元素,Kali 是最后一个:

图片

删除数组中的元素

我们首先创建一个包含 5 个数字的数组,其名称为 num:

num=(1 2 3 4 5)

可以打印一下数组中的元素:​

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

我们可以使用 shell 内置功能 unset 来删除 数组中的第 3 个元素:

unset

现在,我们再来打印一下 num 数组中的元素:

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

上面结果可以看到,第三个元素已经被删除。

也可以使用同样的方法删除数组中所有的元素:

unset

图片

创建具有不同数据类型的混合数组

与其他编程语言不同,在 bash 中,可以创建包含不同数据类型的数组,如下 user.sh 所示:​

#!/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]}"

上述脚本中的数组包含有四个元素,其中第二个元素为整型数据类型,其余三个元素为字符串。

图片

以上就是本次分享全部内容,欢迎讨论。