現在業務でシェルスクリプトのプログラムを作成しているので、
for文の使用方法についてまとめます。
for文の使い方
基本的な使い方は以下のような記載方法です。
for 変数名 in 繰り返し実行したいリスト
do
処理
done
実際に簡単な処理を書くと以下です。
for envitem in aaa bbb ccc ddd
do
echo $envitem
done
以下が実行結果です
aaa
bbb
ccc
dd
変数envitemにaaaが渡され、echo $envitemでaaaをechoします。
この処理をbbb ccc dddも繰り返しで実行してます。
使用用途
同じ処理を複数に対して実行する際に使用します。
例でいうと
あるファイルを20台のサーバに対して転送する際に使用します。
for文を使わない場合:
scp testfile.txt examplesv01:/tmp
上記を20台実行しなければなりません。(めんどくさいですね、、、)
for文を使うと以下だけで実行できます
for server in examplesv01 examplesv02 ...
do
scp testfile.txt $server:/tmp
done
ホスト名が連番なら以下のようにできます
serverlist=(examplesv{01..20})# examplesv01-20までの配列を作成
for server in ${serverlist[@]}
do
scp testfile.txt $server:/tmp
done
配列の変数分処理する場合
配列が格納されている変数を使用してfor文で処理する場合は以下のように記載します。
testlist=(aaa bbb ccc ddd)
for test in ${testlist[@]}
do
echo $test
done
実行結果が以下です。
aaa
bbb
ccc
ddd
[@]を変数名部分に入れる必要があります。
これがない場合は、以下のように最初の部分(aaa)のみが処理されます
testlist=(aaa bbb ccc ddd)
for test in $testlist
do
echo $test
done
補足 zshの場合
先ほどまでの記載部分はbashを想定してます。
しかし、zshの場合は[@]を入れなくても配列分処理されるようです。
~$ echo $SHELL
/bin/zsh
~$ lists=(aaa bbb ccc)
~$ for list in $lists
for> do
for> echo $list
for> done
aaa
bbb
ccc
私はSESのインフラエンジニアで、今まで3つの現場を経験してますが、
どの現場のサーバも基本的にはbashを使用していたので、
あまり気にすることではないかもしれないですが、
Macbookで作業していたりするとzshを使用しているかと思いますので、
bashの気持ちで書いてると思った通りの処理ができないかもしれないですね。
ちなみにこちらは.shファイルに記載して実行したものではなく、
ターミナル上で実行しているため、zshになってましたが、
.shファイルに記載する場合は、文頭にどのシェルを使用するか記載するので、
基本的にはbashかと思います。
以上です。