はじめに
GPS を使って車を運転する場面を想像してください。GPS は指示を 1 つのリストとして示すだけではなく、道路の状況に応じて反応します。渋滞があれば別のルートを案内し、曲がり角を通り過ぎればルートを再計算します。
スクリプトでは、この仕組みを条件分岐と呼びます。条件分岐がなければ、スクリプトはコマンドを順番に実行するだけです。条件分岐があれば、現在の状況を確認し、次に実行する処理を選べます。
これは信頼性の高い自動化の基礎です。実際のシステムの状態は常に同じとは限らないため、優れたスクリプトは決めつけず、状況に応じて処理します。
この実験では、if と else を使ってスクリプトに「判断力」を持たせます。
スクリプトに次の処理をさせます。
- 実際の状態を確認する:ファイルを開こうとする前に、そのファイルが本当に存在するか確認します。
- 判断する:結果が「Yes」なら 1 つの処理を、「No」なら別の処理を実行します。
- ID を確認する:スクリプトを実行するユーザーに Root 権限があるか確認します。
ファイルの存在を確認する
優れたスクリプトは、慎重なドライバーのように、先に確認してから処理します。Linux で最もよく行う確認の 1 つが、「このファイルは存在するか」です。
if ブロック内で -f フラグ(ファイル確認)を使用します。if は警備員のようなものだと考えてください。条件が満たされた場合だけ、ブロック内のコードを実行します。
これは、システムの状態に基づいてスクリプトが判断する、最初の実例です。「コマンドを順番に実行する」だけの処理から、「環境を確認してから処理を選ぶ」処理への大きな一歩になります。管理用スクリプトの多くは、まさにこのパターンを基礎にしています。
まず、プロジェクトフォルダーへ移動します。
cd ~/project
check_file.sh という新しいスクリプトを作成します。
nano check_file.sh
次のコードを入力します。ここでは data.txt が存在するか確認します。
#!/bin/bash
FILE="data.txt"
if [ -f "$FILE" ]; then
echo "$FILE exists."
fi
処理の読み解き方:
if [ ... ]; then:条件を確認する部分です。角括弧内で質問をします。-f "$FILE":質問の内容です。「data.txtは実際のファイルか」を確認します。echo ...:実行する処理です。条件が「Yes」の場合だけ実行されます。fi:「Finish If」を表します。条件分岐の終わりを Linux に伝えます。
[ ... ] という形式は、Bash でテストを実行する一般的な方法です。ここではファイルのプロパティを確認しています。Linux と Bash には、このようなテスト演算子が数多く用意されています。これらを学ぶことで、スクリプトからファイル、文字列、数値、権限について判断できるようになります。
保存(Ctrl+O)して終了(Ctrl+X)します。
実行権限を付与します。
chmod +x check_file.sh
テスト 1:存在しないファイル
スクリプトを実行します。
./check_file.sh
何も表示されません。 何も起こらないように見えます。
なぜでしょうか。data.txt が存在しないためです。条件の結果が「No」だったので、echo コマンドは完全にスキップされました。
テスト 2:存在するファイル
次に、ファイルを作成します。
touch data.txt
スクリプトをもう一度実行します。
./check_file.sh
今度は条件の結果が「Yes」になり、次のように表示されます。
data.txt exists.
else ブロックを追加する
何も表示されないと、スクリプトが失敗したのか、単に処理を終えたのか判断できません。そこで、もう 1 つの処理を用意します。
これは、論理における「道の分岐」に相当します。
- パス A(if):ファイルが存在する。問題ありません。
- パス B(else):ファイルが存在しない。ファイルを作成します。
スクリプトを変更し、不足しているファイルを自動的に作成するようにします。
まず、実際に確認できるようにテスト用ファイルを削除します。
rm data.txt
スクリプトを開きます。
nano check_file.sh
次のように else ブロックを追加します。
#!/bin/bash
FILE="data.txt"
if [ -f "$FILE" ]; then
echo "$FILE exists."
else
echo "$FILE does not exist. Creating it now..."
touch "$FILE"
fi
処理の流れ:
if の条件が True の場合は、最初の部分を実行します。
if の条件が False の場合は、else の部分を実行します。
このようなスクリプトは、情報を表示するだけのスクリプトよりも、実際の運用作業に近いことがよくあります。不足しているものを報告するだけでなく、状況を修正するからです。そのため、条件分岐は多くのセットアップスクリプトやメンテナンススクリプトの基礎になっています。
保存して終了します。
条件分岐をテストする
data.txt が存在しないため、スクリプトはパス B を実行するはずです。スクリプトを実行します。
./check_file.sh
出力:
data.txt does not exist. Creating it now...
すぐにもう一度実行します。今度は data.txt が存在するため、パス A を実行するはずです。
./check_file.sh
出力:
data.txt exists.
これで、スクリプトは「冪等(べきとう)」になりました。これは、100 回実行してもクラッシュせず、常に正しい結果(ファイルが存在する状態)を保証できるという意味です。
この言葉は DevOps でよく登場します。冪等な処理は、コマンドを何回実行したかよりも最終状態が重要になるため、安全に繰り返せます。ジョブが再試行される場合でも、自動化の信頼性が高まります。
Root 権限を確認する
Linux には、鍵がかかっているドアがあります。その鍵を持っているのはスーパーユーザー(Root)だけです。通常のユーザーとしてシステムメンテナンス用スクリプトを実行すると、「Permission Denied」で失敗することがあります。
賢いスクリプトは、ドアを開けようとする前に自分の ID を確認します。
Linux では、すべてのユーザーに番号(UID)が割り当てられています。
- Root の UID は常に 0 です。
- 通常のユーザーは、通常 1000 以上です。
ユーザーの ID を確認するスクリプトを作成します。
check_root.sh を作成します。
nano check_root.sh
次のコードを入力します。
#!/bin/bash
if [ "$UID" -eq 0 ]; then
echo "You are running this script as root."
else
echo "You are running this script as a regular user."
fi
読み解き方:
$UID:現在のユーザー ID 番号を保持する変数です。-eq:「EQuals」を表します。(数値には-eqを使い、単語には=を使います。)
これもテスト構文の例です。[ ... ] 内で数値を比較するとき、Bash では -eq、-ne、-lt、-gt などの演算子を使います。シェルは単語を比較しているのか数値を比較しているのかを区別する必要があるため、文字列比較で使う演算子とは異なります。
保存して終了し、実行権限を付与します。
chmod +x check_root.sh
テスト
現在 labex としてログインしているため、通常のユーザーです。
通常どおり実行します。
./check_root.sh
スクリプトは 0 ではない ID を確認し、次のように表示します。
You are running this script as a regular user.
次に、sudo を使ってスーパーユーザーの権限を一時的に借ります。
sudo ./check_root.sh
sudo は、この 1 回のコマンドに限って ID を 0 に切り替えます。スクリプトはそのことを確認し、次のように表示します。
You are running this script as root.
プロフェッショナルなインストールスクリプトは、このように動作します。Root でなければ実行を拒否します。
目的は、すべての処理で Root 権限を要求することではありません。保護された処理を実行する前に、必要な権限を確認することです。適切に作成されたスクリプトは、途中まで実行して後から分かりにくい権限エラーを発生させるのではなく、明確な説明を表示して早い段階で終了します。
まとめ
これで、スクリプトに判断力を持たせることができました。
この実験では、次の内容を学びました。
- 条件確認(
if):-fを使って「このファイルは存在するか」のような質問をする方法。 - 分岐(
else):答えが「No」だった場合の代替処理を用意する方法。 - ID の確認:数値比較(
-eq)を使ってユーザー権限を確認する方法。
これでスクリプトは、単なるコマンドの一覧ではありません。実行環境に応じて処理を変える、インテリジェントなプログラムになりました。



