对于一些 zsh cheatsheet,我正在调查(间接)变量引用。我有一个标量变量和对它的引用:
scal='Some value'
scalRef=scal
单独使用
scalRef
,我可以通过zsh的间接参数扩展标志scal
获得我想了解的关于(P)
的一切:
echo Value: ${(P)scalRef}
echo Length State Type: ${(P)#scalRef} ${(P)+scalRef} ${(Pt)scalRef}
我也可以轻松获取字符和子字符串:
echo First char: ${${(P)scalRef}[1]}
echo Substring: ${${(P)scalRef}[6,-1]}
要为原始变量分配另一个值,可以使用参数扩展,如下所示:
: ${(P)scalRef::='New value'}
echo scal: $scal
另一个聪明的方法是:
typeset "${scalRef}"='Other value'
echo scal: $scal
现在的问题是:如何更改原始变量中的单个字符或切片?当然,不应该使用
eval
。我试过:
: ${(P)scalRef[1,5]::='Cool'}
echo scal: $scal
但它不会改变任何东西,即使没有报告错误。我期待着
Cool value
。那么,这里会发生什么?另外:
: ${${(P)scalRef}[1,5]::='Unknown'}
echo scal: $scal
但是此尝试会产生错误:没有标识符。预计:
Unknown value
。当然,获取整个原始值,进行更改并替换原始变量的值是一种实用的解决方法。但也许,zsh 参数扩展有一个惯用的答案。
将
P
标志置于与 ::=
分配相同的嵌套级别,在将参考参数转换为包含所需的下标之后:
ref=var var='Some value'
: ${(P)${ref/%/[1,4]}::='Cool'}
echo $var
应该输出
Cool value