【问题标题】:Why doesn't Zsh assign a value to a variable and I have to use eval?为什么 Zsh 不给变量赋值而我必须使用 eval?
【发布时间】:2021-01-20 05:59:20
【问题描述】:

我不理解 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 试图将第一条语句作为命令执行,但第二条语句实际上是分配了一个变量。

【问题讨论】:

  • 您应该使用数组而不是尝试动态创建变量名。

标签: eval zsh


【解决方案1】:

对简单变量的赋值具有以下形式

NAME=VALUE

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

sqlday[$i]=....

如果您将 sqlday 定义为一个数组,例如通过

typeset -a sqlday

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2020-07-22
    • 2012-08-06
    • 2011-11-02
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多