Linuxコマンド–コマンドをn回繰り返す
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. seqとxargsの使用
ここで、かなり効率的であることが証明されている、それほど単純ではないアプローチを使用してみましょう。
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関数を示しました。