接頭辞に一致する変数名を拡張する zsh 構文

接頭辞に一致する変数名を拡張する zsh 構文

TL;博士:zshKsh / Bashに対応する拡張はありますか"${!varnamepfx@}"

たとえば、次のような変数があるとしますset

[...]
foo='random value'
bar=$'amazing\n value'
baz='that other value'
[...]

その後、printf -- %s\\n "${!ba@}"Bashからリクエストすると次のようになります。

bar
baz

私は読んでいたzsh手動しかし、できなかった到着何でも探す構文は上記のように簡単です。私が取ることができる最善のアプローチは、次のネストされた拡張です。

(上記の例の場合)

printf -- %s\\n "${(M)${${(f)$(set)}[@]%%=*}[@]:#ba*}"

作業を安定して実行しているように見えますが(少なくともMacOS Catalinaのzsh v5.3では)、やや複雑に見えますが、$(set)コマンドの置き換えが実際にプロセスを生成するかどうかzsh

もちろん、これまで私は完成システムを通してこれを行うことを排除しました(したがって考慮しませんでした)。なぜなら、そのような単純な作業は少し過度に見えるからです。

答え1

キーを一致させる別のオプション$parameter特殊連想配列使用することですI 下付き文字記号:

$ print -rC1 - $parameters[(I)ba*]
bar
baz

それは連想配列演算子はリスト/配列を生成し、@ ${(kM)parameters:#ba*}Gilleはリスト/配列演算子連想配列に適用されたキーもリスト/配列を生成します。この場合、最終結果は本質的に同じです。

1つだけ覚えている場合は、${(M)array:#pattern}-for grep-arraysがより一般的なので、より便利です。それと比較できないこと配列の下付き文字フラグキーと一致してその値を返すか、値と一致してそのキーを返します。

次のように2つを組み合わせることができます。

$ print -rC1 - ${(Mk)parameters[(R)array*]:#pa*}
path
patchars

pa以下は、(で始まる配列の名前を返します。価値$parameters一致するもののうち、array*)に反対しますpa*

もちろん、すべてのセルフチェックzsh変数($aliases、、、、、、...)に対してこれを行うことができます。$commands$functions$builtins$modules$history

-m patternその一部の場合は、対応する組み込み関数(whence -m、、、、...)の(一致)オプションを使用してクエリを行うこともできますが、そのalias -m場合と同様に出力が行なので、安定して後処理することはできません。 based であり、報告された内容の一部には改行文字を含めることができます。autoload -mfc -mbashcompgen

答え2

Zshには変数名をフィルタリングするための特別な構文はありません。ただ組み合わせるparameters連想配列そしてパラメータ拡張機能${(k)…}キー(パラメータ名など)を取得し、${…:#…}パターンに基づいてフィルタリングし、${(M)…}一致を削除する代わりに保持します。

printf '%s\n' ${(kM)parameters:#ba*}

関連情報