zsh - 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 中的所有变量”的解决方案的必要前提,尽管我可能会误解这一点。)
解决方案
typeset -m
可以拯救:
-m
如果
-m
给定了标志,则名称参数被视为模式(使用引号来防止这些被解释为文件模式)。-f
如果没有属性标志,则打印具有匹配名称的所有参数(或带有标志的函数)(TYPESET_SILENT
在这种情况下不使用 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
或者$parameters
从zsh/parameters
模块可以帮助:
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
推荐阅读
- delphi - 在按字符串过滤时隐藏 TListBox 中的项目
- java - 如何将 SQL 结果转换为 android studio 上的字符串?
- c++ - 如何在 C++ 中将多个变量与某种数据类型进行比较?
- javascript - 我无法让我切换的 classList 样式实际应用那里的样式
- dc.js - 添加空数据集时显示消息(或空图)
- c# - 使用 LAMBDA 在 C# LINQ 中自定义排序
- vb.net - 使用事件 ListView_ItemSelectionChanged 时消息框出现两次
- javascript - 通过 props 将解析的异步数据从父组件发送到子组件 - Vue
- dialogflow-es - 如何在谷歌对话流中添加多个链接建议卡
- oracle - 在 Oracle 中,如何获取已采样 X 年的唯一站点列表?