最初のシェルスクリプトを作る
目標
シェルスクリプトの骨格(シバン、実行権限、引数、環境変数、条件分岐、終了コード)を一通り体験します。
なぜ重要なのか
スクリプトは人ではなく、別のプログラムが呼び出します。そのため、出力ストリームと終了コードがインターフェースです。結果はstdout、エラーと使い方はstderr、成功と失敗は終了コードです。この規約を守ってこそ、result=$(script.sh)のような使い方が成り立ち、CIが失敗を検知できます。使い方の案内をstdoutに出した瞬間、それがそのまま結果の値になってしまいます。そして、設定を環境変数で渡し、なければ妥当なデフォルト値で動く形が、デプロイ自動化の標準です。
ステップ
/root/bin/greet.shを作り、1行目を#!/bin/bashにしてください。- そのファイルに実行権限を付けてください。
greet.sh labhubを実行すると、正確にHello, labhub!を出力するようにしてください。- 引数なしで実行すると
Hello, world!になるように、デフォルト値を入れてください。引数を渡した場合は、引き続きその引数が使われなければなりません。 - 環境変数
GREETINGが設定されていれば、あいさつをその値に変えてください。GREETING=Hi greet.sh labhubはHi, labhub!、設定がなければHello、GREETING=Yo greet.shはYo, world!になる必要があります。 /root/bin/checkfile.sh <경로>を作ってください。通常ファイルならfile、ディレクトリならdir、存在しなければmissingを出力します(プレースホルダーはパスです)。/root/bin/grade.sh <점수>を作ってください。90以上はA、80–89はB、70–79はC、それ未満はFです(プレースホルダーは点数です)。/root/bin/deploy.shを作ってください。環境変数APP_ENVを読み取って、- なければ標準エラー出力に案内を出し、終了コード
2で終了します prod/stage以外の値なら、終了コード3で終了しますprodまたはstageなら、deploying to <값>を出力し(プレースホルダーは値です)、終了コード0で終了します
- なければ標準エラー出力に案内を出し、終了コード
参考
${1:-world}は、最初の引数がないか空のときにだけworldを使います。echo "메시지" >&2で標準エラー出力に書きます(プレースホルダーはメッセージです)。- よくある間違い1: ステップ5で環境変数のデフォルト値を入れるときに位置引数を上書きすると、ステップ4が壊れます。2つは独立して動作する必要があります。
- よくある間違い2: ステップ7で
>=の代わりに>を使うと、90がBに落ちます。境界値を1つずつ手で入れてみてください。
スクリプトファイルとシバン
/root/bin/greet.shを作り、1行目を#!/bin/bashにしてください。
1行目の#!は、カーネルにこのファイルをどのインタープリターで実行するかを知らせる印です。
実行権限を付ける
そのファイルに実行権限を付けてください。
chmod +xで実行ビットをオンにします。
引数を受け取って出力する
greet.sh labhubを実行すると、正確にHello, labhub!を出力するようにしてください。
最初の位置引数は$1です。カンマと感嘆符の位置まで、正確に合わせる必要があります。
引数のデフォルト値の処理
引数なしで実行するとHello, world!になるように、デフォルト値を入れてください。引数を渡した場合は、引き続きその引数が使われなければなりません。
${1:-デフォルト値}構文を使うと、引数がないときにだけデフォルト値が使われます。引数があれば、そのまま生きている必要があります。
環境変数であいさつを変える
環境変数GREETINGが設定されていれば、あいさつをその値に変えてください。GREETING=Hi greet.sh labhubはHi, labhub!、設定がなければHello、GREETING=Yo greet.shはYo, world!になる必要があります。
環境変数と位置引数の両方に、デフォルト値の処理が必要です。互いに干渉してはいけません。
ファイルの種類を判別する
/root/bin/checkfile.sh <경로>を作ってください。通常ファイルならfile、ディレクトリならdir、存在しなければmissingを出力します(プレースホルダーはパスです)。
-fと-dは、それぞれ通常ファイルとディレクトリを検査します。順序を誤ると、ディレクトリがmissingに入ってしまうことがあります。
点数の等級を付ける
/root/bin/grade.sh <점수>を作ってください。90以上はA、80–89はB、70–79はC、それ未満はFです(プレースホルダーは点数です)。
境界値が罠です。90と89、80と79、70と69を、それぞれ手で確認してください。
環境変数の検証と終了コード
/root/bin/deploy.shを作ってください。環境変数APP_ENVを読み取って、
- なければ標準エラー出力に案内を出し、終了コード
2で終了します prod/stage以外の値なら、終了コード3で終了しますprodまたはstageなら、deploying to <값>を出力し(プレースホルダーは値です)、終了コード0で終了します
標準出力と標準エラー出力を区別し、状況ごとに異なる終了コードを返す必要があります。exitの後ろの数字が規約です。