![bash [内部]中括弧拡張反復回数/変数にアクセス](https://linux33.com/image/21960/bash%20%5B%E5%86%85%E9%83%A8%5D%E4%B8%AD%E6%8B%AC%E5%BC%A7%E6%8B%A1%E5%BC%B5%E5%8F%8D%E5%BE%A9%E5%9B%9E%E6%95%B0%2F%E5%A4%89%E6%95%B0%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9.png)
質問:
現在処理中の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
。次に、中括弧引数の代わりにコマンドラインに拡張を挿入し、コマンドラインの解析を続けます。完了すると、シェルは次のコマンドを実行します。
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"
- どの変数が編集されているかを知る方法はありませんecho
。
答え3
独自の変数を使用して繰り返し数を計算し、それをエコーしてみてください。実行中に何が起こるかを確認するには、-xオプションを使用して実行します。 bash -xと同様に、exの位置を知らせます。しかし、達成しようとする目標が具体的でないと、助けにくくなります。