ZSHでは、文字列値から配列への中括弧拡張を実行します。

ZSHでは、文字列値から配列への中括弧拡張を実行します。

次のスニペットで説明されている状況を考慮すると、次のようになります。

# Input string provided as function argument:
input='base/{local,remote,other}$(echo hi)'
# Desired result from performing just brace expansion of the above:
expected=('base/local$(echo hi)' 'base/remote$(echo hi)' 'base/other$(echo hi)')

ZSHでこれを行う正しい方法は何ですか?ただ任意のカスタム入力文字列を中括弧で展開し、結果パラメータの配列を別の変数に保存しますか?値の中括弧拡張を強制的に見つけた唯一の方法は、eval?を使用することです。だから私が要求することが可能かどうか疑問に思います。

いくつかの研究では、次のことがうまくいく可能性があることを示唆していますが、実際にはそうではないようです。

expanded=(${^input})
# Results in: expanded=('base/{local,remote,other}$(echo hi)')

ベストアンサー1

他の形式の拡張ではなく、シェルコードで見つけることができるように拡張を実行するには演算子がないので、後を除くすべての項目を引用するのとeval同じ方法を使用する必要があります。そして。{},

たぶん、次のようなものがあります。

set -o extendedglob
eval "expanded=( ${input//(#m)[^{\},]##/${(qq)MATCH}} )"

(引用符があっても{1..5}アクティブな場合..のように、まだ拡張されているようです。)-{a-f}braceccl

a\{x,y}上記はエスケープ、拡張を処理しませんa\x a\yと 。a"{x,y}"a"x" a"y"

注:bracexpandこのオプションが有効になっていて、noglobこのオプションが有効になっていない場合(mkshとksh93の最新バージョンのデフォルト)、kshは引用符で囲まれていない引数拡張またはコマンド置換に対して中括弧拡張を実行します。

ksh93の場合、ワイルドカードを無効にするもう1つの方法はに設定することですFIGNORE*したがって、ksh93では次のことができます。

IFS= FIGNORE=*
expanded=( $input )

おすすめ記事