Bash:使用日期作为数组键时,值对于基数来说太大

Bash:使用日期作为数组键时,值对于基数来说太大

我读过有关指定“10#”的内容,但我认为这不是我的情况,因为我没有进行数字比较。我正在尝试在 Bash 中创建关联数组,并且代码直到今天(2021-02-08)都工作正常:

dailyData["$today"]="$todayData"

$today 是 ISO 格式的一天,$todayData 不相关。
我收到错误2021-02-08: value too great for base (error token is "08")

为什么 Bash 将此日期格式解释为数字,其中任意字符串完成工作(关联数组键)?
如果我只想使用“08”作为字典键怎么办?

答案1

这是因为dailyData自动创建为索引数组而不是关联数组。从man bash

如果使用语法分配任何变量,则会自动创建索引数组name[subscript]=value。下标被视为必须计算为数字的算术表达式。

dailyData如果您显式声明为关联数组,问题就会消失:

$ declare -A dailyData[2021-02-08]="$todayData"

$ declare -p dailyData
declare -A dailyData=([2021-02-08]="" )

答案2

我无法重现关联数组的问题:

#! /bin/bash
declare -A dailyData
today=2021-02-08
todayData=whatever
dailyData["$today"]="$todayData"

但是,如果我使用普通数组,即declare -a(注意大小写!)或根本没有声明,那么我会收到您提到的错误。这是因为数组索引被解释为算术表达式,因此对于 2021-02-07,它只是计算为 2021 - 2 - 7 = 2012,但对于 2021-02-08,减法中的最后一个数字无效八进制。

相关内容