首页 > 解决方案 > zsh 相当于 bash ${!name*} 或 ${!name@}

问题描述

bash中,有一个参数扩展来生成与给定前缀匹配的变量的名称。例如:

$ 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 中的所有变量”的解决方案的必要前提,尽管我可能会误解这一点。)

标签: zsh

解决方案


typeset -m可以拯救:

-m

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

-- zshbuiltins(1),shell 内置命令,排版

% 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

或者$parameterszsh/parameters模块可以帮助:

parameters

此关联数组中的键是当前定义的参数的名称。

-- zshmodules(1),zsh/参数模块,参数

% 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

推荐阅读