【问题标题】:zsh equivalent of bash ${!name*} or ${!name@}zsh 相当于 bash ${!name*} 或 ${!name@}
【发布时间】:2019-11-23 14:13:45
【问题描述】:

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

似乎没有任何方法可以对参数 name 执行任何类型的通配,只能在参数的扩展 上执行。

(这似乎是解决“Use wildcard expansion to echo all variables in zsh”的必要前提,尽管我可能会误会。)

【问题讨论】:

    标签: zsh


    【解决方案1】:

    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), the zsh/parameter module, 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看到,以为是我想象的。
    猜你喜欢
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2011-11-08
    • 2018-10-11
    • 1970-01-01
    相关资源
    最近更新 更多