假設在 中建立一個動態命名的變量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 ))
任何替代方法將不勝感激。