シーケンスのシェル中括弧拡張で$variableを使用する方法は?

シーケンスのシェル中括弧拡張で$variableを使用する方法は?

$var inBashでスコープ付きシェル中括弧拡張を使用したいと思います。単に{$var1..$var2}働かなかったので「水平」に行きました...

以下はうまくいきますが、少し混乱しています。

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

もう少し「一般的な」方法がありますか?

答え1

次のことを試すこともできます。

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

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

答え2

すでにわかっているように、拡張はbut or not{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./'`

最も簡単な解決策は、rm foo.{$ext0..$extN}欲しいものを望む場所にzshを使用することです。

答え3

    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 スタイル for ループを使用すると、中かっこ拡張で先行ゼロを処理することと一致しません。

答え4

ルートディレクトリのファイルの総数を見つけるには、次のコマンドがあります。

コマンド01:

 ls -dq *dog* | wc -l

一連の数字を使用して複数のフォルダを作成するコマンドもあります。

コマンド02:

mkdir -p {0..3}

私は、ルートディレクトリに名前に「DOG」という文字列を含む3つのファイルを知っています。

しかし、別のルートフォルダで01コマンドを使用し、名前に "DOG"を含むファイルの数を計算し、結果を変数resultに保存し、コマンド02に示されている "3"の代わりにこの変数を使用したいと思います。

サブフォルダ1、2、3を作成しようとする可能なすべての試みは次のとおりです。

result=$ls -dq *dog* | wc -l) mkdir {0..$result}

result=$(ls -dq *dog* | wc -l) | mkdir {0..$result}

ls -dq *dog* | wc -l | xargs I{} mkdir {0..{}}





ls -dq *dog* | wc -l | while read file; do mkdir -p {1.."$file"}; done

しかし、上記の試みでは、2つの結果しか得られません。名前付きフォルダーが作成されたり、{0..3}結果の印刷を受け取った以外は何も起こりません。

 ls -dq *dog* | wc -l

解決策は次のとおりです。

見ているこの回答所望の結果を達成するモデルを構築することが可能である。

eval "mkdir -p {1..`ls -dq *dog* | wc -l`}"

mkdir {1 .. $variable}「内部的に変数を使う」という質問をしたので、厳密に言えば最も適切な答えではありません。

関連情報