TL;博士:zsh
Ksh / 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 -m
fc -m
bash
compgen
答え2
Zshには変数名をフィルタリングするための特別な構文はありません。ただ組み合わせるparameters
連想配列そしてパラメータ拡張機能:${(k)…}
キー(パラメータ名など)を取得し、${…:#…}
パターンに基づいてフィルタリングし、${(M)…}
一致を削除する代わりに保持します。
printf '%s\n' ${(kM)parameters:#ba*}