Bash 中的数组

Bash 脚本入门

Alex Scriven

Data Scientist

什么是数组?

Bash 中有两类数组:

  • 普通数组
    • "普通"的数字索引结构。
    • 在 Python 中叫"list",在 R 中叫"vector"。

在 Python 中:my_list = [1,3,2,4]

在 R 中:my_vector <- c(1,3,2,4)

Bash 脚本入门

在 Bash 中创建数组

在 Bash 中创建数字索引数组有两种方式。

1. 仅声明,不加元素

declare -a my_first_array

2. 创建并同时添加元素

my_first_array=(1 2 3)

记住——等号两侧不要有空格!

Bash 脚本入门

注意逗号!

Bash 中分隔数组元素不使用逗号:

这并不正确:

my_first_array=(1, 2, 3)

这是正确的:

my_first_array=(1 2 3)
Bash 脚本入门

重要的数组属性

  • 使用 array[@] 可返回所有元素。注意,访问这些属性时需在数组名外加花括号。
my_array=(1 3 5 2)
echo ${my_array[@]}
1 3 5 2
  • 数组长度用 #array[@] 获取
echo ${#my_array[@]}
4
Bash 脚本入门

操作数组元素

用方括号访问数组元素。

my_first_array=(15 20 300 42)
echo ${my_first_array[2]}
300
  • 记住:Bash 数组从 0 开始索引,像 Python(但不同于 R!)
Bash 脚本入门

操作数组元素

用索引表示法设置数组元素。

my_first_array=(15 20 300 42 23 2 4 33 54 67 66)

my_first_array[0]=999
echo ${my_first_array[0]}
999
  • 记住:覆盖索引时不要在前面加 $,如 $my_first_array[0]=999 会失败。
Bash 脚本入门

操作数组元素

使用 array[@]:N:M 对数组进行"切片"。

  • 其中 N 为起始索引,M 为返回的元素个数。
my_first_array=(15 20 300 42 23 2 4 33 54 67 66)
echo ${my_first_array[@]:3:2}
42 23
Bash 脚本入门

向数组追加

使用 array+=(elements) 追加到数组。

例如:

my_array=(300 42 23 2 4 33 54 67 66)

my_array+=(10) echo ${my_array[@]}
300 42 23 2 4 33 54 67 66 10
Bash 脚本入门

(未)向数组追加

不加括号会发生什么?来看一下。

例如:

my_array=(300 42 23 2 4 33 54 67 66)
my_array+=10
echo ${my_array[@]}
30010 42 23 2 4 33 54 67 66

字符串 10 只会拼到第一个元素后面。这不是我们想要的!

Bash 脚本入门

关联数组

  • 关联数组
    • 类似普通数组,但用键值对而非数字索引
    • 类似 Python 的 dictionary 或 R 的 list
    • 注意:仅 Bash 4 起支持。部分现代 Mac 的 Bash 很旧!在终端用 bash --version 检查

在 Python 中:

my_dict = {'city_name': "New York", 'population': 14000000}

在 R 中:

my_list = list(city_name = c('New York'), population = c(14000000))
Bash 脚本入门

创建关联数组

只能用 declare 语法(大写 -A)创建关联数组。

可先声明再添加元素,或一行完成。

  • 用方括号包住"键",等号后写值。
    • 可一次添加多个元素。
Bash 脚本入门

关联数组示例

来创建一个关联数组:

declare -A city_details # 先声明

city_details=([city_name]="New York" [population]=14000000) # 添加元素
echo ${city_details[city_name]} # 用键索引以返回值
New York
Bash 脚本入门

创建关联数组

也可一行创建并赋值关联数组

  • 其余相同
declare -A city_details=([city_name]="New York" [population]=14000000)

! 访问关联数组的"键"

echo ${!city_details[@]} # 返回所有键
city_name population
Bash 脚本入门

Passons à la pratique !

Bash 脚本入门

Preparing Video For Download...