【初心者向け】シェルスクリプトを書くなら「while read 変数名」を覚えるといいです!!

記事タイトルとURLをコピーする

こんにちは。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」は主題から外れるため、割愛します。

3行目

cat instance-tag.list | while read line

ここは、「cat instance-tag.list」の結果を1行ずつ「line」という変数に定義しています。

今回の例で言うと以下の通りとなります。

  • 1回目の処理のline変数の中身
    i-0f6126b7aeedfabd6,hoge

  • 2回目の処理のline変数の中身
    i-050536efdd9dc1126,fuga

  • 3回目の処理の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 変数名」をご紹介しました。 どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

SRE3課

2019/10 入社

AWS CLIが好きです。