
簡単なファイル名生成の例から始めましょう。
echo (xx|yy|zz)*.txt # Example 1
これは、xx または yy または zz で始まるすべての txt ファイルをリストします。次に、コマンド置換を使用してこれらの代替を動的に生成します。echo
ここでは、目的を示すためにのみ使用しています。「実際の」例では、もちろん、これは次のようなプログラムになります。
echo $(echo '(xx|yy|zz)')*.txt # Example 2
これは上記のように動作します。ここで難しい部分があります。コマンド置換は、選択肢のリストの一部のみを提供する必要があります。
echo ($(echo 'xx|yy')|zz)*.txt # Example 3 (does not work)
これはもう機能しません。zz で始まるファイルは見つかりますが、yy で始まるファイルは見つかりません。Zsh は文字通りxx|yy
ここで始まるファイルを検索していると思われます。
補助変数を使用すれば、これを動作させることができます。
list=$(echo 'xx|yy')
echo (${~list}|zz)*.txt # Example 4
さて、私の質問です。
一時変数を使用せずに例 4 の効果を実現することは可能ですか?
答え1
次のように使用します:
echo (${~"$(echo 'xx|yy')"}|zz)*.txt
コマンド置換の周りの引用符に注意してください。これは、zsh
コマンド置換時にデフォルトでグロブを行わない場合、単語の分割を実行します。これは次のような場合に便利です。
echo (${~${(j:|:)$(cmd)}}).txt
cmd
withの出力内の単語を結合し|
、それをグロブとして解釈します。b
これらの単語自体をパターンとして扱いたくない場合は、パラメータ拡張フラグも参照してください。
echo (${~${(j:|:)${(b)$(cmd)}}}).txt