假设在 中创建一个动态命名的变量zsh
,因此:
name="hello"
typeset $name=42
echo ${(P)${name}} # Prints the variable $hello, which is 42
现在,假设一个人想要增加或更改所述变量,但不知道它的直接名称,即我希望类似于以下内容的东西可以工作:
(( ${(P)${name}} = ${(P)${name}} + 1 )) # Set $hello to 43?
以上不起作用 - 什么会?
就像在任何类似 Korn 的外壳中一样。或POSIXly:
关键是所有参数扩展、命令替换和算术扩展都是在计算算术表达式之前在算术表达式内完成的。
类似于
所以在
(($name++))
(likelet "$name++"
) 中,它首先被扩展为hello++
并被评估为++
应用于hello
变量的运算符。POSIX
sh
没有((...))
运算符,但有$((...))
算术扩展运算符。它没有++
(尽管它允许实现有一个作为扩展,而不是要求它是一元和/或二元+
运算符的组合),但它有+=
.通过使用
: "$((...))"
where:
is null 命令,我们得到类似于 ksh's 的东西((...))
。虽然严格的等价物是[ "$((...))" -ne 0 ]
, as((expression))
在表达式解析为 0 时返回 false。看起来会这样做:
任何替代方法将不胜感激。