シーケンスのシェルブレース展開で$ variableを使用するにはどうすればよいですか?


33

$var inbashで、範囲を持つシェルブレース拡張を使用します。単純に置くだけで{$var1..$var2}はうまくいかないので、「横向き」にした...

以下は動作しますが、少し面倒です。

# remove the split files
echo rm foo.{$ext0..$extN} rm-segments > rm-segments
source rm-segments

もっと「通常の」方法はありますか?

回答:


26

あなたが試してみたいことがあります:

eval rm foo.{$ext0..$extN}

これが最良の答えであるかどうかはわかりませんが、確かに1つです。


ダール!:(明白なものを見ることができませんでした...ありがとう:)
Peter.O

4
bashでは、{}展開は$展開の前に発生するため、evalまたは他のトリックを使用して式を2回通過させる以外にこれを行う方法はないと思います。
mattdm

6
私はちょうどそれが!...ありません「だ」何のブレース展開{$one..$three}、それはこの場合には、整数を期待ブレース拡張の有効な形式ではありませんので、それが唯一の$ VARの拡張後の有効な形になり...、これはeval、通常のブレースシーケンス拡張を生成するために同じプロセスを通過... 1 2 3 QED;)...概要:単純なプレゼンスブレース対does'tトリガーブレース膨張...唯一の有効なフォームトリガーは。
Peter.O

@フレッド:ようこそ:
asoundmove

のような変数を使用する場合a={0..9}; echo $a;ブレース拡張はありません。を使用してeval、動作します。@mattdmの説明は良いと思います。
dr0i

20

すでに実現として、{1..3}膨張するの1 2 3が、{foo..bar}または{$foo..$bar}トリガブレース展開、そして後者は続いて代わるように拡張されていない$fooと、$barその値によって。

GNU(たとえば、非組み込みLinux)のフォールバックはseqコマンドです。

for x in `seq $ext0 $extN`; do rm foo.$x; done

別の可能性。foo.シェル特殊文字が含まれていない場合、

rm `seq $ext0 $extN | sed 's/^/foo./'`

最も簡単な解決策は、zshを使用するrm foo.{$ext0..$extN}ことです。


オプションをありがとう..それらがすべてグループ化されているのを見るのは良いことです.. bashとevalに固執します。もはや問題ではありません。なぜならライダーの良い馬を変更する必要はありません。)...
Peter.O

1

他の回答を使用して議論している間evalseq、にbash、あなたは伝統的なCスタイルの使用できるfor算術文脈でループを。変数ext0extN((..))、定義された範囲でループが実行されるように内部で展開されます。

for (( idx = ext0; idx <= extN; idx++ )); do
    [[ -f "$foo.$idx" ]] || { printf "file %s does not exist" "$foo.$idx" >&2 ; continue }
    rm "$foo.$idx"
done

最適な方法を探していて、複数のrmコマンドを避けたい場合は、一時的なプレースホルダーを使用してファイル名の結果を保存し、rmワンショットで呼び出すことができます。

 results=()
 for (( idx = ext0; idx <= extN; idx++ )); do
     [[ -f "$foo.$idx" ]] || { printf "file %s does not exist" "$foo.$idx" >&2 ; continue }
     results+=( "$foo.$idx" )
 done

そして今rm、展開された配列でコマンドを呼び出します

 rm -- "${results[@]}"

0
    function f_over_range {
        for i in $(eval echo {$1..$2}); do
            f $i
        done
    }

    function f {
        echo $1
    }

    f_over_range 0 5
    f_over_range 00 05

ノート:

  • evalを使用すると、コマンドインジェクションのセキュリティリスクが露呈する
  • Linuxは「00 \ n01 \ n02..etc」を出力しますが、OSXは「1 \ n2 \ n ... etc」を出力します
  • ループのseqまたはCスタイルを使用すると、ブレース展開の先行ゼロの処理と一致しません
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.