像大多数编程语言一样, bash 脚本有时需要处理相关值的列表。 最简单的形式是标准数组。
在 bash,数组编程是完全不同的,特别是在语法方面。 Bash 数组也是严格的一维数组,但它们仍然有很多用途。
Bash 数组的基本语法
在中创建数组 bash 很简单。 您可以使用方括号初始化整个数组,例如:
city=(London Paris Milan "New York")
(您可以在这个城市示例中找到所有代码 这个 GitHub 要点.)
这将创建一个包含四个元素的数组,索引从 0 到 3。请注意,第四个值是由两个单词组成的带引号的字符串。 您需要引用包含空格的值以阐明它们不是单独的值。
您可以使用跨编程语言通用的括号语法访问单个元素:
city[2]
由于这是 bash,您需要进行一些改进才能在表达式中实际使用该值:
- 您需要在前面加上美元符号 ($) 到变量名。
- 您还需要使用大括号 ({}) 使变量名明确。 默认情况下, bash 会治疗 $城市[2] 作为一个名为的变量 城市. 添加大括号告诉 bash 也评估括号和索引号。
标准 bash 数组访问语法为:
${variable_name[index]}
这是一个完整的例子:
#!/bin/bash
city=(London Paris Milan "New York")
echo ${city[3]}
# New York
您可以逐步分配给它,而不是一次性初始化一个数组。 此脚本与前面的示例等效:
#!/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 循环中寻址数组,以迭代其内容。 例如,这是一个简单的循环,它打印数组中每个文件的行数 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 您正在使用,了解它的细微差别很重要。 即使是普通的变量语法也有很多特质。