回答:
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
ArrayLength=${#array[@]}
、我々はここではなく、それを使用して行う方法をmax
?
bash for
は、変数(反復子)と、反復子が反復する単語のリストで構成されます。
したがって、単語のリストが限られている場合は、次の構文で入力します。
for w in word1 word2 word3
do
doSomething($w)
done
おそらくいくつかの数値に沿って反復したいので、seq
コマンドを使用して数値のリストを生成できます(たとえば1から100まで)。
seq 1 100
そして、それをFORループで使用します。
for n in $(seq 1 100)
do
doSomething($n)
done
$(...)
構文に注意してください。それはあなたが(から私たちの場合は一つのコマンドからの出力を渡すことができます、bashの振る舞いですseq
(別の)for
)
これは、たとえば次のように、パス内のすべてのディレクトリを反復処理する必要がある場合に非常に役立ちます。
for d in $(find $somepath -type d)
do
doSomething($d)
done
リストを生成する可能性は無限です。
bash
組み込みのヘルプを試してください:
$ help for
for: for NAME [in WORDS ... ;] do COMMANDS; done
The `for' loop executes a sequence of commands for each member in a
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
assumed. For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Equivalent to
(( EXP1 ))
while (( EXP2 )); do
COMMANDS
(( EXP3 ))
done
EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is
omitted, it behaves as if it evaluates to 1.
#! /bin/bash
function do_something {
echo value=${1}
}
MAX=4
for (( i=0; i<MAX; i++ )) ; {
do_something ${i}
}
これは、古いシェルでも機能する一方で、大量のカウントに対して効率的である例です。
Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'
しかし、幸運は、内部の有益なことをやってawk
:どのように私はawkスクリプトでシェル変数を使うのですか?
do
/ done
ペアの代わりに中括弧を使用していることです。
私は通常、標準のforループでわずかなバリアントを使用することを好みます。これをよく使用して、一連のリモートホストでコマンドを実行します。私はbashのブレース展開を利用して、非数値のforループを作成できるforループを作成しています。
例:
フロントエンドホスト1〜5およびバックエンドホスト1〜3でuptimeコマンドを実行したい。
% for host in {frontend{1..5},backend{1..3}}.mycompany.com
do ssh $host "echo -n $host; uptime"
done
私は通常、これを上記の読みやすいバージョンではなく、行の終わりにセミコロンを付けて1行のコマンドとして実行します。使用上の主な考慮事項は、中括弧を使用すると、文字列に挿入する複数の値を指定でき(たとえば、pre {foo、bar} post結果はprefoopost、prebarpostになります)、二重ピリオドを使用してカウント/シーケンスを許可できます(a。 .zなど)。ただし、二重ピリオド構文はbash 3.0の新機能です。以前のバージョンはこれをサポートしません。
bashでのみ興味がある場合は、上記の「for((...))」ソリューションが最適ですが、すべてのuniceで機能するPOSIX SH準拠のものが必要な場合は、「expr」を使用する必要があります。 「while」、「(())」、「seq」、「i = i + 1」はさまざまなシェル間で移植性がないため
私はいつもこれのバリエーションを使ってファイルを処理しています...
* .log内のファイルの場合 do echo "Do stuff with:$ files"; echo "次のことをもっと行う:$ files"; 完了。
ファイルのリストの処理に関心がある場合は、ファイルの-execdirオプションを調べてください。