bash [内部] 中括弧展開の繰り返し回数/変数へのアクセス

bash [内部] 中括弧展開の繰り返し回数/変数へのアクセス

質問:

現在処理中の bash 反復の番号にアクセスすることは可能ですか?

疑似コマンド

mv {1..5}.something.{1..5} $x1.$x2.something
  • 注: これは論理的な表現であり、動作しないサンプルです。

疑似出力

mv 1.something.1 1.1.something
mv 1.something.2 1.2.something
...
mv n.something.m n.m.something
  • ここで、n と m は、それぞれ対応する中括弧展開の反復です。

説明

私は次のようなループに精通しています:

for x in {1..10}; do echo -n "$x "; done

ご覧のとおり、bashは反復を$xに設定しています。それが可能かどうか、またどの変数を使用するか定義していない場合にbashが使用する変数にアクセスする方法を知りたいです。bashにブレース拡張反復処理する変数がない場合、何らかの方法で [内部的に] 反復処理を実行する必要があります。スクリプトの実行時にこの変数にアクセスできることを期待しています。

皆さんに感謝します#バッシュ

答え1

あなたはブレース拡張の仕組みを誤解しています。上記の Dennis Williamson のコメントをもう一度読んでください。

と書くとmv foo.{1,2,3} bar、シェルは実際には次のように入力したのと同じようにコマンドを複数回呼び出していると考えられます。

mv foo.1 bar
mv foo.2 bar
mv foo.3 bar

もしそれが本当なら、あなたの質問は意味を成すでしょう。シェルは複数のコマンドを実行しているので、リストを保持する必要があるのです。

しかし、実際にはそうではありません。ブレースの拡張は拡大します一つの議論結果のコマンドラインを呼び出す一度したがって、上記の例では、シェルは引数にfoo.{1,2,3}中括弧の展開が含まれていることを確認し、その引数を 3 つの引数に展開しますfoo.1 foo.2 foo.3。次に、その展開を中括弧で囲まれた引数の代わりにコマンド ラインに挿入し、コマンド ラインの解析を続けます。完了すると、シェルは次のような 1 つのコマンドを実行します。

mv foo.1 foo.2 foo.3 bar

したがって、シェルが中括弧で囲まれた引数を展開しているときはリストを保持している可能性がありますが、中括弧の展開は完全に完了しており、他の引数が解析されるまでに展開に関するすべての情報が使い果たされて忘れられているため、他の引数の展開でそのリストにアクセスする方法はありません。

いずれにせよ、このような引数が役立つのは、シェルが複数のコマンドを実行している場合だけですが、実際にはそうではありません。複数のコマンドを実行するには、実際のループを使用する必要があります。括弧の展開ではそれができません。

については$_、これはループ変数の代わりに使用できる Perl 構造 (xループの例のように) なので、括弧の展開とは実際には関係ありません。

答え2

具体的にmvは、-vフラグを使用するだけで、現在処理されている内容を確認できます。@DennisWilliamson が指摘したように、中括弧展開シーケンスには変数が設定されていません - と書くことは、echo {1..5}と書くことと同じですecho 1 2 3 4 5。 - と比較するとecho "$foo"、事後にどの変数が ed されたかを知る方法はありませんecho

答え3

独自の変数を使用して反復回数をカウントし、それをエコーし​​てみてはいかがでしょうか。実行時に何が起こっているかを確認したい場合は、-x オプションを付けて実行してください。bash のように -x を使用すると、ex 内の場所がわかります。ただし、何を達成しようとしているのかを指定しないと、助けるのは難しいです。

関連情報