怎样在 Bash 脚本中使用数组

像大多数编程语言一样, bash 脚本有时需要处理相关值的列表。 最简单的形式是标准数组。

在 bash,数组编程是完全不同的,特别是在语法方面。 Bash 数组也是严格的一维数组,但它们仍然有很多用途。

Bash 数组的基本语法

在中创建数组 bash 很简单。 您可以使用方括号初始化整个数组,例如 example:

city=(London Paris Milan "New York")

(你可以找到这个城市的所有代码 example 在 这个 GitHub 要点.)

这将创建一个包含四个元素的数组,索引从 0 到 3。请注意,第四个值是由两个单词组成的带引号的字符串。 您需要引用包含空格的值以阐明它们不是单独的值。

您可以使用跨编程语言通用的括号语法访问单个元素:

city[2]

由于这是 bash,您需要进行一些改进才能在表达式中实际使用该值:

  • 您需要在前面加上美元符号 ($) 到变量名。
  • 您还需要使用大括号 ({}) 使变量名明确。 默认情况下, bash 会治疗 $城市[2] 作为一个名为的变量 城市. 添加大括号告诉 bash 也评估括号和索引号。

标准 bash 数组访问语法为:

${variable_name[index]}

这里有一个完整的 example:

#!/bin/bash

city=(London Paris Milan "New York")
echo ${city[3]}

# New York

您可以逐步分配给它,而不是一次性初始化一个数组。 这个脚本是一个更长的等价于前一个 example:

#!/bin/bash

city[0]=London
city[1]=Paris
city[2]=Milan
city[3]="New York"
echo ${city[3]}

# New York

请注意,无论哪种情况,您都需要注意不要在等号周围添加任何空格。 “城市[0] = London”,等号周围有空格,将产生错误。

Bash 数组的更多用途

数组非常适合存储相关数据。 这是一个(非常有限的)shell脚本,用于获取数字的平方根:

#!/bin/bash

sqrt[1]=1
sqrt[4]=2
sqrt[9]=3
sqrt[16]=4
sqrt[25]=5

echo ${sqrt[$1]}

请注意,脚本使用该值 1美元 作为数组索引。 1美元 表示脚本接收的第一个命令行参数,因此您可以像这样运行此脚本:

$ ./sqrt.sh 9
3

您可能知道 $(cmd) 执行命令并将其输出保存在变量中的语法。 您可以将其与数组初始化语法结合使用,以获得要使用的文件数组:

arr=( $(ls) )

数组通常是用于迭代的完美数据结构,Bash 也不例外。 您可以循环遍历数组以打印每个元素或对每个成员执行操作。

您可以在 for .. in 循环中寻址数组,以迭代其内容。 为了 example,这是一个简单的循环,它打印数组中每个文件的行数 arr

for file in "${arr[@]}"; do
wc -l "$file"
done

# 3 envvars
# 547 httpd.conf
# ...

请注意,此模式使用 @ 符号从数组中检索所有元素。

更多 Bash 数组语法

您可以使用以下方法获取数组中的项目数:

echo ${#city[@]}

# 4

您可以将新元素添加到标准数组的末尾,如下所示:

arr+=(4)

因此,要将第五个城市添加到列表中:

city+=(Rome)
echo ${city[@]}

# London Paris Milan New York Rome

要提取数组的一块,您可以使用一种近似于许多其他语言的切片操作的语法:

${arr[@]:s:n}

此语法将返回从位置开始的数组切片 s 并包含 n 项目。 你可以省略 :n 部分从中提取所有项目 s 直到列表的末尾。

echo ${city[@]:2:2}
# Milan New York

echo ${city[@]:3}
# New York Rome

Bash 有很多功能,他们只是需要一些学习

数组 bash 可能有限制,但它们提供与大多数编程语言相同的基本功能。 虽然 bash 历史上只支持简单的一维数组,时代在变。 最新版本的 bash4, 支持关联数组和负数组索引。

无论哪个版本 bash 您正在使用,了解它的细微差别很重要。 即使是普通的变量语法也有很多特质。