1. 序章

コマンドの繰り返しは、Linuxスクリプトを使用するときに最も一般的に使用される操作の1つです。

このクイックチュートリアルでは、さまざまなアプローチを使用して操作n回を実行する方法を示します。

2. forループの使用

例全体で使用するタスクを定義することから始めましょう。 簡単にするために、「コマンド」という単語をコンソールに5回出力します。 可能な限り、反復番号も含めます。

そこに直接飛び込んで、古き良き「forループ」から始めましょう。

for i in {1..5}
do
  echo "Command no. $i"
done

上記の例では、次の結果が得られます。

Command no. 1
Command no. 2
Command no. 3
Command no. 4
Command no. 5

これらの操作を1行のソリューションに凝縮することもできます。

for i in {1..5}; do echo "Command no. $i"; done

条件ベースの式が必要なシナリオでは、よりプログラミングスタイルのアプローチを使用することもできます。

for ((i=0;i<5;i++)); do echo "Command no. $i"; done

3. whileループの使用

繰り返し可能なコマンドを実装するために、「whileループ」を使用することもできます。

i=1
while [[ $i -le 5 ]]; do
  echo "Command no. $i"
  let ++i;
done

前の例のように、このループを1行で実装できます。

i=1; while [[ $i -le 5 ]]; do echo "Command no. $i"; let ++i; done

4. seqxargsの使用

ここで、かなり効率的であることが証明されている、それほど単純ではないアプローチを使用してみましょう。

Linuxのドキュメントによると、 seqは数値のシーケンスを出力し xargs は引数リストを作成し、各引数で指定されたコマンドを実行します。

そのことを念頭に置いて、これら2つの操作をパイプ処理して、繰り返し可能なコマンドを作成できます。

seq 5 | xargs -I{} echo "Command no. {}"

上記の例では、プレースホルダー文字列「{}」で-Iフラグを使用しました。 次に、定義されたコマンドのプレースホルダーがシーケンス番号に置き換えられ、上記と同じ出力が得られます。

5. Bash関数

これまでに説明したすべてのソリューションには、ある程度の定型コードが必要です。

繰り返し可能なコマンドを頻繁に使用したい場合は、例の1つをbash関数に書き直すことができます。

function repeat(){
  for ((i=0;i<$1;i++)); do
    eval ${*:2}
  done
}

これで、シェルで関数を使用できます。

repeat 5 echo "Command"

上記の例では、 eval を使用して、変数の割り当てなど、実行可能ファイルではないコマンドを使用できるようにしました。

また、 $ {*:2} を導入しました。これは、インデックス2から始まるすべてのコマンド入力変数の配列に評価されます。

この実装は複数の引数を受け入れるため、repeat関数に複数のコマンドを渡すこともできます。

repeat 5 echo "Command" ";" echo "Another command"

6. ZSH

前述の例はすべてのbashシェルに有効ですが、ZSHのような他のソリューションもあります。

このシェルには、コマンドn回を繰り返すための単純な組み込み関数があります。

repeat 5 echo "Command"

また、複数のコマンドの場合:

repeat 5 {echo "Command1"; echo "Command2"}

7. 結論

この記事では、Linuxコマンドを複数回繰り返すいくつかの方法について説明しました。

バニラbashスクリプトの使用例を見て、カスタムシェルZSHの事前定義されたrepeat関数を示しました。