假设在 中创建一个动态命名的变量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?
上面的方法不起作用——什么可以呢?
答案1
$ name=hello
$ hello=42
$ (($name++))
$ echo $hello
43
就像任何类似 Korn 的 shell 一样。或者 POSIXly:
$ name=hello
$ hello=42
$ : "$(($name += 1))"
$ echo "$hello"
43
要点是,所有参数扩展、命令替换和算术扩展都是在计算算术表达式之前在算术表达式内完成的。
((something))
类似于
let "something"
因此,在(($name++))
(like let "$name++"
) 中, it 首先扩展为hello++
,并将其计算为++
应用于hello
变量的运算符。
POSIXsh
没有((...))
运算符,但有$((...))
算术运算扩张操作员。它没有++
(尽管它允许实现将其作为扩展,而不是要求它是一元和/或二元+
运算符的组合),但它有+=
.
通过使用: "$((...))"
where :
is null 命令,我们得到类似于 ksh 的内容((...))
。尽管严格等价的是,但当表达式解析为 0 时,[ "$((...))" -ne 0 ]
as返回 false。((expression))
答案2
看起来这会做到这一点:
typeset $name=$(( ${(P)${name}} + 1 ))
任何替代方法将不胜感激。