更改 zsh 中作为变量名称引用给出的原始变量的字符

问题描述 投票:0回答:1

对于一些 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 参数扩展有一个惯用的答案。

zsh
1个回答
0
投票

P
标志置于与
::=
分配相同的嵌套级别,在将参考参数转换为包含所需的下标之后:

ref=var var='Some value'
: ${(P)${ref/%/[1,4]}::='Cool'}
echo $var

应该输出

Cool value

© www.soinside.com 2019 - 2024. All rights reserved.