こんにちは。AWS CLIが好きな福島です。
はじめに
今回は、タイトル通りですが、シェルスクリプトを書く際に覚えておくといい「while read 変数名」をご紹介します。
私は、シェルスクリプトとは6年前から友達ですが、 「while read 変数名」は、シェルスクリプトを書く上で必ずと言っていいほど使っています。 初心者の方でも、これさえ覚えておけば怖いものはないんじゃないかと思っています。
ざっくり解説
「while read 変数名」は、受け付けた出力を1行ずつ変数名に定義します。
使い方
ここから「while read 変数名」の使い方をご紹介します。
今回は、例として、EC2にSystemタグを付与することとします。 また、インスタンスIDとそれらに付与するタグ情報のリストは持っているものとします。
リストファイル
リストの中身は、以下の通りとします。
# cat instance-tag.list i-0f6126b7aeedfabd6,hoge i-050536efdd9dc1126,fuga i-0869f24358fb3f698,f8k #
1列目:インスタンスID
2列目:Systemタグに付与するValue
スクリプト
上記を実現するスクリプトは、以下の通りです。
#!/bin/bash cat instance-tag.list | while read line do instance_id=$(echo $line | cut -d, -f 1) tag_value=$(echo $line | cut -d, -f 2) aws ec2 create-tags --resources ${instance_id} --tags Key=System,Value=${tag_value} done
解説
1行目
#!/bin/bash
は、それぞれ以下の意味があります。
#!
は、シェルスクリプトの先頭に記述されるシバン(shebang)と呼ばれる特殊な文字列です。
シバンは、スクリプトファイルが実行される際に、どのインタプリタ(解釈実行プログラム)を使用するかを指定します。
3行目
cat instance-tag.list | while read line
ここは、「cat instance-tag.list」の結果を1行ずつ「line」という変数に定義しています。
今回の例で言うと以下の通りとなります。
1回目の処理のline変数の中身
i-0f6126b7aeedfabd6,hoge2回目の処理のline変数の中身
i-050536efdd9dc1126,fuga3回目の処理のline変数の中身
i-0869f24358fb3f698,f8k
4,9行目
do : done
whileを使うにあたって必要な構文です。 ※リストファイルの行数分、「do」と「done」の間に書いたコマンドが実行されます。
5行目
instance_id=$(echo $line | cut -d, -f 1)
- $()
$()は、()内に指定したコマンドの実行結果を返してくれます。 今回の場合、「echo $line | cut -d, -f 1」の実行結果が「instance_id」に定義されます。
- echo $line
1回目の処理の場合、「echo $line」には、「i-0f6126b7aeedfabd6,hoge」が入ります。
- |
「echo $line」の出力を「|」で「cut」コマンドに渡しています。
- cut -d, -f 1
「-d」は、区切り文字を指定できます。 今回の場合、「-d,」なので、区切り文字は、「,」です。 ※デフォルトは、スペース区切りのため、リストファイルがスペース区切りであれば、ここは不要です。
「-f」は、区切り文字で区切った際に欲しい情報の列番号を指定します。 今回の場合、「-f 1」なので、列番号は、「1」です。
その結果、「instance_id」には、「i-0f6126b7aeedfabd6」が定義されます。
6行目
tag_value=$(echo $line | cut -d, -f 2)
5行目と同じ要領です。 ここでは、「-f 2」なので、1回目の処理の場合、「tag_value」には、「hoge」が入ります。
8行目
aws ec2 create-tags --resources ${instance_id} --tags Key=System,Value=${tag_value}
instance_idとtag_valueに定義された情報を使って、特定のインスタンスにSystemタグを付与しています。
補足
今回は、「while read 変数名」の使い方を一番にお伝えしたかったので、 スクリプトを雑に書いてますが、本来であれば、以下のコマンドを使うなどして、変更前と変更後のタグ情報を取得し、 正しく、タグが付与できていることを確認することをお勧めします。
aws ec2 describe-tags \ --filters "Name=resource-id,Values=${instance_id}" \ --query "Tags[].[Key,Value]"
余談
cutコマンドの部分は、awkコマンドを使うこともあります。 今回は、cutの方が処理速度が速いため、cutコマンドを使いました。
ちなみにawkの場合は、以下のように記述します。
instance_id=$(echo $line | awk -F, '{print $1}') tag_value=$(echo $line | awk -F, '{print $2}')
終わりに
今回は、シェルスクリプトを書く際に覚えておくといい「while read 変数名」をご紹介しました。 どなたかのお役に立てれば幸いです。