为什么 Zsh 不给变量赋值而我必须使用 eval?

Why doesn't Zsh assign a value to a variable and I have to use eval?

我不明白 Zsh 中的这种行为:

~ % i=0
~ % date_input=2021-01-01
~ % sqlday${i}=$(date -j -v+${i}d -f "%Y-%m-%d" "$date_input" +%Y-%m-%d)
zsh: command not found: sqlday0=2021-01-01
~ % 

为什么提示“找不到命令?”为什么不把变量赋值给 2021-01-01?但是,当我使用 eval:

~ % eval sqlday${i}=$(date -j -v+${i}d -f "%Y-%m-%d" "$date_input" +%Y-%m-%d)
~ % echo $sqlday0 
2021-01-01

所以我想我不明白为什么 Zsh 试图将第一条语句作为命令执行,但第二条语句实际上是分配一个变量。

简单变量的赋值形式为

NAME=VALUE

参数扩展发生在 VALUE 内,而不是 NAME 内。这是不必要的。如果你有数组(关联和非关联),为什么要动态生成变量名。

sqlday[$i]=....
如果您将 sqlday 定义为数组,例如

会起作用

typeset -a sqlday

UPDATE :没有必要显式声明数组(尽管我认为这是很好的编程习惯)。 Zsh 会从您使用的方式推断出 sqlday,它必须是一个数组。