zsh中与bash ${!name*}或${!name@}相当的语法是什么?

8
在中,有一个参数扩展的方法来生成与给定前缀匹配的变量名。例如:
$ foo1=a foo2=b four=4
$ echo "${!foo@}"
foo1 foo2

zsh 中有相应的功能吗?我知道 (P) 参数扩展标志是类似于 bash 的间接扩展 ${!foo} 的等价物:

# bash
$ foo=bar bar=3
$ echo ${!foo}
3

# zsh
% foo=bar bar=3
% echo ${(P)foo}
3

据我所知,(P) 不支持前缀匹配。
% echo "${(P}foo@}"
zsh: bad substitution

似乎没有办法对参数的名称进行任何类型的通配符匹配,只能在参数扩展时进行。

(这似乎是解决“在zsh中使用通配符扩展来echo所有变量”的必要前提,尽管我可能对此有所误解。)

1个回答

5

typeset -m 命令可以拯救您:

-m

如果使用了 -m 标记,则将名称参数视为模式(请使用引号防止其被解释为文件模式)。如果没有属性标记,则打印具有匹配名称的所有参数(或使用 -f 标志的函数)(在此情况下不使用shell选项 TYPESET_SILENT)。

-- zshbuiltins(1), shell builtin commands, typeset

% foo1=a foo2=b four=4
% typeset -m 'foo*'
foo1=a
foo2=b
% typeset +m 'foo*'
foo1
foo2
% setopt extendedglob
% print -l ${$(typeset +m 'foo*')/(#m)*/${(P)MATCH}}
a
b

或者使用zsh/parameters模块中的$parameters变量:

$parameters

这个关联数组的键名是当前定义的参数的名称。

-- zshmodules(1),zsh/parameter模块,parameters

% foo1=a foo2=b four=4
% print -l ${(Mk)parameters:#foo*}
foo1
foo2
% setopt extendedglob
% print -l ${${(Mk)parameters:#foo*}/(#m)*/${(P)MATCH}}
a
b

啊,我记得 parameters 被定义过,但是不记得在哪里看到了。在 man zshparams 中没有看到它,所以以为自己想象错了。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接