本記事には広告(アフィリエイトリンク)が含まれます。

シェルスクリプト入門 変数・条件分岐・ループ

Linuxエンジニア養成講座 第14回|全36回・フェーズ2「Linux基礎」の11回目です。
前回までに学んだこと: systemd の役割、systemctl による起動・停止・自動起動設定、journalctl でのログ確認、サービスが起動しないときの切り分けパターン(第13回)。
今回学ぶこと: 環境変数の仕組み、.bashrc と .bash_profile の役割、シェルスクリプトの基本(変数・条件分岐・ループ)。

この記事を読み終えると、以下のことができるようになります。

  • 環境変数(PATH, HOME, LANG)の役割を説明できる
  • .bashrc と .bash_profile の違いを説明できる
  • シバン(#!/bin/bash)の意味を説明できる
  • 変数の定義・参照・コマンド置換を使える
  • if/then/fi で条件分岐を書ける
  • for と while でループを書ける
  • サービスの状態を自動チェックするスクリプトを自分で書ける

alma-mainにSSH接続した状態で進めます。以降のコマンドはすべてalma-main上で実行します。

なぜシェルスクリプトを学ぶのか

前回systemctl is-active sshd でサービスの状態を確認する方法を学びました。1つのサービスなら手動で十分ですが、本番環境では sshd、crond、firewalld、httpd、mariadb など複数のサービスが動いています。10台のサーバーで5つのサービスを確認するとしたら、合計50回同じコマンドを手で打つことになります。

シェルスクリプトは、こうした繰り返し作業を自動化する仕組みです。一度スクリプトを書いておけば、いつでも同じ手順を正確に再現できます。「手作業でやると30分かかる確認作業が、スクリプトなら10秒で終わる」という場面は現場で日常的に発生します。

シェルスクリプトを書く前に、まずシェルの仕組みを理解する必要があります。環境変数とプロファイルの話から始めます。

環境変数を知る

第4回df -h を実行したとき、出力が日本語で表示されたことを覚えていますか。あれは LANG という環境変数が ja_JP.UTF-8 に設定されていたからです。環境変数とは、シェル(bash)がプログラムに渡す設定値のことです。

PATH — コマンドが見つかる仕組み

ターミナルで ls と入力すると、bash は「ls というプログラムがどこにあるか」を探します。そのとき参照するのが PATH 環境変数です。

alma-mainで実行

実行コマンド:

$ echo $PATH

実行結果:

/home/developer/.local/bin:/home/developer/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin

:(コロン)で区切られた複数のディレクトリが並んでいます。bash はこれらのディレクトリを左から順に探し、最初に見つかったプログラムを実行します。ls/usr/bin/ls に存在するため、PATH に /usr/bin が含まれていれば ls だけで実行できるわけです。

HOME と LANG

実行コマンド:

$ echo $HOME

実行結果:

/home/developer

HOME はログイン中のユーザーのホームディレクトリです。cd を引数なしで実行すると HOME のディレクトリに移動するのは、この変数を参照しているためです。

実行コマンド:

$ echo $LANG

実行結果:

ja_JP.UTF-8

LANG はロケール(言語・文字コード)の設定です。ja_JP.UTF-8 が設定されているため、コマンドの出力が日本語で表示されます。

env で一覧を見る

env コマンドで、現在設定されている環境変数の一覧を確認できます。

実行コマンド:

$ env | head -20

実行結果:

SHELL=/bin/bash
PWD=/home/developer
LOGNAME=developer
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/home/developer
LANG=ja_JP.UTF-8
SSH_CONNECTION=192.168.1.100 52504 192.168.1.121 22
XDG_SESSION_CLASS=user
SELINUX_ROLE_REQUESTED=
LESSOPEN=||/usr/bin/lesspipe.sh %s
USER=developer
SELINUX_USE_CURRENT_RANGE=
SHLVL=1
XDG_SESSION_ID=196
XDG_RUNTIME_DIR=/run/user/1000
SSH_CLIENT=192.168.1.100 52504 22
DEBUGINFOD_URLS=%{dist_debuginfod_url}
DEBUGINFOD_IMA_CERT_PATH=/etc/keys/ima:
which_declare=declare -f

SSH_CONNECTION や XDG_SESSION_ID の値は接続ごとに変わるため、読者の環境では異なる値が表示されます。

環境変数がいくつ設定されているか数えてみます。

実行コマンド:

$ env | wc -l

実行結果:

27

27個の環境変数が設定されています。すべてを覚える必要はありません。PATH、HOME、LANG の3つを押さえておけば、当面は十分です。

export — 環境変数を設定する

自分で環境変数を作ることもできます。export コマンドを使います。

実行コマンド:

$ export MYVAR=hello
$ echo $MYVAR

実行結果:

hello

export で設定した環境変数は、そのシェルから起動した子プロセス(コマンドやスクリプト)にも引き継がれます。export なしで MYVAR=hello と書いた場合はシェル変数となり、子プロセスには引き継がれません。この違いは後ほどスクリプトを書くときに関係してきます。

.bashrc と .bash_profile

環境変数は、ターミナルを閉じると消えてしまいます。ログインするたびに export MYVAR=hello を手で打つのは現実的ではありません。そこで、ログイン時に自動で読み込まれる設定ファイルがあります。

ログインシェルと非ログインシェル

bash が起動するとき、「ログインシェル」と「非ログインシェル」の2種類があります。

  • ログインシェル: SSH接続時やコンソールログイン時に起動するシェル。.bash_profile が読み込まれる
  • 非ログインシェル: ログイン後に bash コマンドで新しくシェルを起動した場合や、スクリプトの実行時。.bashrc が読み込まれる

ファイルの中身を見てみます。

実行コマンド:

$ cat ~/.bash_profile

実行結果:

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

# User specific environment and startup programs

注目してほしいのは . ~/.bashrc の行です。これは「.bashrc を読み込む」という意味です(.source コマンドの省略形)。つまり、ログインシェルでも .bashrc の内容が読み込まれるようになっています。

実行コマンド:

$ cat ~/.bashrc

実行結果:

# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

# User specific environment
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]
then
    PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
if [ -d ~/.bashrc.d ]; then
	for rc in ~/.bashrc.d/*; do
		if [ -f "$rc" ]; then
			. "$rc"
		fi
	done
fi

unset rc

.bashrc の中では /etc/bashrc(システム全体の設定)を読み込み、さらに PATH に $HOME/.local/bin$HOME/bin を追加しています。先ほど echo $PATH で表示されたディレクトリの一部は、ここで追加されたものです。

読み込みの流れをまとめると次のようになります。

ログインシェル(SSH接続時):
  /etc/profile → ~/.bash_profile → ~/.bashrc → /etc/bashrc

非ログインシェル(bashコマンド実行時):
  ~/.bashrc → /etc/bashrc

自分用の環境変数やエイリアスを追加する場合は ~/.bashrc に書くのが一般的です。ログインシェルでも .bash_profile 経由で .bashrc が読み込まれるため、.bashrc に書いておけばどちらの場合でも反映されます。

設定を変更した後は、source ~/.bashrc を実行すると、ログインし直さなくても変更が反映されます。

この2つのファイルの違いを今すべて暗記する必要はありません。「環境変数を永続化したいときは ~/.bashrc に書く」「変更したら source で反映する」の2点を覚えておけば、当面の作業で困ることはありません。なお、第24回の cron で「ログインシェルとの違い」が重要になります。そのときにもう一度この話に戻ります。

はじめてのシェルスクリプト

シバン — スクリプトの1行目

シェルスクリプトは、コマンドを並べたテキストファイルです。ファイルの1行目に #!/bin/bash と書きます。これを「シバン(shebang)」と呼びます。

シバンは「このスクリプトを /bin/bash で実行する」という指定です。OS がスクリプトを実行するとき、1行目のシバンを見て、どのプログラムで処理するかを判断します。

bash の場所を確認してみます。

実行コマンド:

$ which bash

実行結果:

/usr/bin/bash

bash は /usr/bin/bash にあります。一方、シバンでは /bin/bash と書くのが慣例です。AlmaLinux 9 では /bin/usr/bin へのシンボリックリンクのため、どちらも同じファイルを指します。

実行コマンド:

$ ls -l /bin

実行結果:

lrwxrwxrwx. 1 root root 7 10月  3  2024 /bin -> usr/bin

/bin -> usr/bin と表示されており、/bin/usr/bin を指すシンボリックリンクであることが確認できます。このシリーズでは #!/bin/bash で統一します。

スクリプトを作って実行する

第9回で学んだ vi を使って、最初のスクリプトを作成します。

実行コマンド:

$ vi ~/hello.sh

vi が開いたら i で挿入モードに入り、以下の内容を入力します。入力が終わったら Esc:wq で保存します。

#!/bin/bash
echo "Hello, Shell Script!"
echo "Current user: $(whoami)"
echo "Today: $(date +%Y-%m-%d)"

作成したファイルの内容を確認します。

実行コマンド:

$ cat ~/hello.sh

実行結果:

#!/bin/bash
echo "Hello, Shell Script!"
echo "Current user: $(whoami)"
echo "Today: $(date +%Y-%m-%d)"

このままでは実行できません。第11回で学んだパーミッションを思い出してください。実行権限を付与する必要があります。

実行コマンド:

$ chmod +x ~/hello.sh
$ ~/hello.sh

実行結果:

Hello, Shell Script!
Current user: developer
Today: 2026-03-30

日付の部分は実行日によって異なります。

スクリプトの実行方法は2通りあります。

  • ./hello.sh(または ~/hello.sh): 実行権限(chmod +x)が必要。シバンで指定したプログラムで実行される
  • bash hello.sh: 実行権限は不要。bash コマンドの引数として渡すため、シバンの指定は無視される

本番運用では chmod +x して直接実行する方法が一般的です。シバンに何を指定したかが明確になるためです。

変数

変数の定義と参照

シェルスクリプトでは、値を変数に格納して使い回すことができます。

実行コマンド:

$ NAME="AlmaLinux"
$ echo "OS is $NAME"

実行結果:

OS is AlmaLinux

変数名の前に $ を付けると値が展開されます。${NAME} のようにブレース(波括弧)で囲む書き方もあります。変数名の直後に文字が続くとき、どこまでが変数名かを明確にするために使います。

実行コマンド:

$ NAME="AlmaLinux"
$ echo "OS is ${NAME}"

実行結果:

OS is AlmaLinux

第12回echo $$ を使って現在のシェルの PID を確認しました。あの $$ は bash が自動で設定する特殊変数です。$?(直前のコマンドの終了ステータス)も特殊変数の一つで、この後の条件分岐で使います。

やらかし体験 — = の前後にスペースを入れる

他のプログラミング言語では x = 1 のようにスペースを入れて書くことが多いですが、bash の変数代入ではスペースを入れるとエラーになります。意図的にやってみましょう。

実行コマンド:

$ NAME = "Taro"

実行結果:

-bash: NAME: コマンドが見つかりません

bash はスペースを「コマンドと引数の区切り」として解釈します。NAME = "Taro" と書くと、bash は NAME をコマンド名、="Taro" をその引数だと判断します。NAME というコマンドは存在しないため、「コマンドが見つかりません」というエラーになります。

もう一つのパターンも試します。

実行コマンド:

$ NAME= "Taro"

実行結果:

-bash: Taro: コマンドが見つかりません

今度は NAME=(空文字を代入)した上で "Taro" をコマンドとして実行しようとしています。正しい書き方は次の通りです。

実行コマンド:

$ NAME="Taro"
$ echo $NAME

実行結果:

Taro

= の前後にスペースを入れない。これは bash の変数代入で最も多い間違いです。エラーメッセージに「コマンドが見つかりません」と出たら、変数代入のスペースを疑ってください。

コマンド置換 — コマンドの実行結果を変数に入れる

$() の中にコマンドを書くと、そのコマンドの実行結果を文字列として取得できます。

実行コマンド:

$ echo "Today is $(date +%Y-%m-%d)"

実行結果:

Today is 2026-03-30

日付は実行日によって異なります。先ほどの hello.sh でも $(whoami)$(date +%Y-%m-%d) を使っていました。スクリプト内でコマンドの実行結果を変数に格納するときに頻繁に使います。

ダブルクォートとシングルクォート

ダブルクォート(")の中では変数が展開されますが、シングルクォート(')の中では展開されません。

  • "Hello $NAME"Hello Taro(変数が展開される)
  • 'Hello $NAME'Hello $NAME(文字列そのまま)

変数を展開したいときはダブルクォート、文字列をそのまま表示したいときはシングルクォートを使います。

条件分岐

終了ステータス — コマンドの成功・失敗を数値で表す

条件分岐の前に、「終了ステータス」を理解する必要があります。Linux のすべてのコマンドは、実行が終わると「終了ステータス」と呼ばれる数値を返します。0 が成功、0以外 が失敗です。

$? で直前のコマンドの終了ステータスを確認できます。

実行コマンド:

$ ls /etc/hostname
$ echo $?

実行結果:

/etc/hostname
0

存在するファイルを指定したので ls は成功し、終了ステータスは 0 です。

実行コマンド:

$ ls /etc/nonexistent
$ echo $?

実行結果:

ls: '/etc/nonexistent' にアクセスできません: そのようなファイルやディレクトリはありません
2

存在しないファイルを指定したので ls は失敗し、終了ステータスは 2 です。

前回学んだ systemctl is-active でも終了ステータスを確認してみます。

実行コマンド:

$ systemctl is-active sshd
$ echo $?

実行結果:

active
0

sshd は動作中のため、active が出力され終了ステータスは 0(成功)です。

実行コマンド:

$ systemctl is-active nginx
$ echo $?

実行結果:

inactive
3

nginx はインストールされていないため、inactive が出力され終了ステータスは 3(失敗)です。inactive はサービスが動作していないことを意味し、未インストールの場合も停止中の場合も同じ出力になります。if 文はこの終了ステータスを使って「成功したら A を実行、失敗したら B を実行」という分岐を行います。

if/then/fi 構文

bash の条件分岐は if / then / else / fi で書きます。

if コマンド; then
    成功時の処理
else
    失敗時の処理
fi

if の後に書いたコマンドの終了ステータスが 0(成功)なら then 以降が実行され、0以外(失敗)なら else 以降が実行されます。fiif を逆に綴ったもので、if ブロックの終わりを示します。

systemctl is-active と組み合わせてみます。

実行コマンド:

$ if systemctl is-active sshd > /dev/null 2>&1; then echo "sshd is running"; else echo "sshd is NOT running"; fi

実行結果:

sshd is running

> /dev/null 2>&1第8回で学んだリダイレクトです。systemctl is-active の出力(active/inactive)を捨てて、終了ステータスだけを判定に使っています。

test コマンドと [ ]

if 文では「ファイルが存在するか」「数値が大きいか」といった比較も行いたくなります。そのために test コマンド(別名 [)を使います。

[ の正体を確認してみます。

実行コマンド:

$ type [

実行結果:

[ はシェル組み込み関数です

[ はコマンドです。そのため、[ の後ろと ] の前にはスペースが必要です(コマンドと引数の間にはスペースが要るのと同じ理屈です)。

ファイルの存在チェックをしてみます。

実行コマンド:

$ if [ -f /etc/hostname ]; then echo "File exists"; else echo "File not found"; fi

実行結果:

File exists

-f は「通常のファイルが存在するか」を判定するオプションです。ディレクトリの存在を確認するには -d を使います。

数値の比較も試します。

実行コマンド:

$ NUM=10
$ if [ $NUM -gt 5 ]; then echo "Greater than 5"; fi

実行結果:

Greater than 5

主な比較演算子をまとめます。

演算子意味
-eq等しい(equal)[ $A -eq $B ]
-ne等しくない(not equal)[ $A -ne $B ]
-gtより大きい(greater than)[ $A -gt $B ]
-ltより小さい(less than)[ $A -lt $B ]
-fファイルが存在する[ -f /etc/hostname ]
-dディレクトリが存在する[ -d /tmp ]
=文字列が等しい[ “$A” = “hello” ]
!=文字列が等しくない[ “$A” != “hello” ]

すべてを暗記する必要はありません。必要になったら help test で確認できます。

サービスチェックスクリプトを作る

ここまでの知識を組み合わせて、サービスの状態をチェックするスクリプトを作ってみます。vi で ~/check_service.sh を作成します。

実行コマンド:

$ vi ~/check_service.sh

以下の内容を入力します。

#!/bin/bash
SERVICE="sshd"

if systemctl is-active "$SERVICE" > /dev/null 2>&1; then
    echo "$SERVICE is running"
else
    echo "$SERVICE is NOT running"
fi

実行コマンド:

$ chmod +x ~/check_service.sh
$ ~/check_service.sh

実行結果:

sshd is running

動きました。SERVICE 変数の値を "crond""firewalld" に変えれば、別のサービスもチェックできます。ただし、サービスごとにスクリプトを修正するのは手間です。次のセクションで学ぶ「ループ」を使えば、複数のサービスをまとめてチェックできるようになります。

ループ

for ループ — リストを順に処理する

for ループは、指定したリストの要素を1つずつ変数に代入しながら処理を繰り返します。

実行コマンド:

$ for i in 1 2 3; do echo "Number: $i"; done

実行結果:

Number: 1
Number: 2
Number: 3

in の後に並べた値が順番に変数 i に入り、do から done の間の処理が繰り返されます。

for ループと systemctl is-active を組み合わせれば、複数のサービスを一括でチェックできます。

実行コマンド:

$ for service in sshd crond firewalld; do echo "$service: $(systemctl is-active $service)"; done

実行結果:

sshd: active
crond: active
firewalld: active

3つのサービスの状態が1行のコマンドで確認できました。冒頭で話した「10台のサーバーで5つのサービスを確認」の第一歩です。

seq — 連番を生成する

seq コマンドで連番を生成し、for ループと組み合わせることができます。

実行コマンド:

$ seq 1 5

実行結果:

1
2
3
4
5

for i in $(seq 1 5); do echo "Server-$i"; done のように使えば、Server-1 から Server-5 まで連番で処理できます。

while ループ — 条件が真の間繰り返す

while ループは、条件が成立している間、処理を繰り返します。

実行コマンド:

$ count=1
$ while [ $count -le 3 ]; do echo "Count: $count"; count=$((count + 1)); done

実行結果:

Count: 1
Count: 2
Count: 3

$((count + 1)) は算術展開で、変数の値に1を加算しています。-le は「以下(less than or equal)」を意味する比較演算子です。

while ループにはもう一つ、while read line というファイルを1行ずつ読み込むパターンがあります。これは 第26回「シェルスクリプト実践」で扱います。

やってみよう

ここまでに学んだ変数・条件分岐・ループを組み合わせて、サービス状態チェックスクリプトを作成してください。

課題1: 複数サービスの一括チェック

以下の仕様のスクリプト ~/service_check.sh を作成してください。

  • sshd、crond、firewalld の3つのサービスを順にチェックする
  • 各サービスについて、動作中なら「[OK] サービス名 is running」、停止中なら「[NG] サービス名 is NOT running」と表示する
  • for ループと if 文を使う

ヒント: for ループの中に if 文を入れます。先ほどの check_service.sh と for ループのサービス一括チェックを組み合わせてください。

解答例

#!/bin/bash
for service in sshd crond firewalld; do
    if systemctl is-active "$service" > /dev/null 2>&1; then
        echo "[OK] $service is running"
    else
        echo "[NG] $service is NOT running"
    fi
done

実行結果:

[OK] sshd is running
[OK] crond is running
[OK] firewalld is running

課題2(拡張): 結果をファイルに出力する

課題1のスクリプトを修正して、結果を ~/service_report.txt にも保存するようにしてください。第8回で学んだリダイレクトを活用します。

ヒント: スクリプトの最後に > ~/service_report.txt を付けるのではなく、スクリプト内で tee コマンドを使うと画面表示とファイル保存を同時にできます。

課題3(拡張): 日時付きログ形式で出力する

課題2をさらに発展させて、出力の先頭に実行日時を付けてください。

ヒント: コマンド置換 $(date '+%Y-%m-%d %H:%M:%S') を使えば現在の日時を取得できます。スクリプトの冒頭で echo "=== Service Check: $(date '+%Y-%m-%d %H:%M:%S') ===" のように書くと、いつ実行したかが分かるログになります。

課題3まで完了すると、第24回で cron による定期実行と組み合わせて「毎朝サービスの状態を自動チェックしてログに残す」仕組みを作る準備が整います。

演習後のクリーンアップ

演習で作成したファイルは以降の回では使いません。残しておいても問題はありませんが、ホームディレクトリを整理したい場合は以下で削除できます。

実行コマンド:

$ rm ~/hello.sh ~/check_service.sh ~/service_check.sh ~/service_report.txt

削除する前に ls ~/ で対象ファイルを確認する習慣をつけてください。

現場のヒヤリハット

現場のヒヤリハット — 変数未定義の rm -rf で全消し

あるエンジニアが、不要なディレクトリを削除するスクリプトを書きました。

#!/bin/bash
rm -rf $DIR/old_data

このスクリプトには致命的な問題があります。変数 DIR が未定義(値が空)の場合、$DIR/old_data/old_data に展開されます。さらに、もし $DIR の後にスラッシュがなく rm -rf $DIR とだけ書いていたら、rm -rf(引数なし)になるか、環境によっては rm -rf / と解釈される危険があります。

対策は2つあります。

  1. 変数を使う前に定義されているか確認する: if [ -z "$DIR" ]; then echo "DIR is not set"; exit 1; fi
  2. 変数をダブルクォートで囲む: rm -rf "$DIR/old_data"(空文字列の場合にエラーで止まる)

第7回rm の危険性に触れましたが、シェルスクリプトでは変数を介して rm を使う場面が増えるため、さらに注意が必要です。rm -rf をスクリプトに書くときは「この変数が空だったらどうなるか」を必ず考えてください。

自走のヒント

man bash で bash のマニュアルを読めます。非常に長いドキュメントですが、/CONDITIONAL で検索すれば条件式の一覧、/for ( で検索すれば for ループの構文にたどり着けます。

help test を実行すると、test コマンド([)で使える比較演算子の一覧が表示されます。help ifhelp forhelp while でそれぞれの構文も確認できます。bash の組み込みコマンドは man ではなく help で調べる点に注意してください。

シェルスクリプトの文法ミスを自動で検出するツールとして ShellCheck(https://www.shellcheck.net/)があります。ブラウザ上でスクリプトを貼り付けると、問題のある箇所と修正方法を教えてくれます。手元のスクリプトが期待通りに動かないとき、文法の問題かどうかを切り分けるのに役立ちます。

理解度チェック

以下の文が正しければ○、間違っていれば×と答えてください。

  1. 環境変数 PATH は、コマンドを探すディレクトリの一覧を保持している
  2. NAME = "Taro" のように = の前後にスペースを入れると、正常に変数が代入される
  3. シバン #!/bin/bash は、スクリプトを bash で実行するという指定である
  4. ~/.bashrc に書いた設定は、SSH接続(ログインシェル)でも反映される
  5. コマンドの終了ステータスが 0 のとき、コマンドは失敗したことを意味する
  6. [ -f /etc/hostname ] は、/etc/hostname がディレクトリとして存在するかを確認する
  7. for service in sshd crond; do echo $service; done は、sshd と crond を順に表示する
  8. export で設定した環境変数は、そのシェルから起動した子プロセスにも引き継がれる

解答

  1. ○ ―― bash は PATH に含まれるディレクトリを左から順に探し、最初に見つかったプログラムを実行する
  2. × ―― bash では = の前後にスペースを入れると、変数名がコマンドとして解釈されエラーになる。正しくは NAME="Taro"
  3. ○ ―― シバンはスクリプトの1行目に書き、どのプログラムで実行するかを指定する
  4. ○ ―― AlmaLinux のデフォルト設定では、~/.bash_profile の中で ~/.bashrc が読み込まれるため、ログインシェルでも .bashrc の内容が反映される
  5. × ―― 終了ステータス 0 は成功を意味する。0以外 が失敗
  6. × ―― -f は「通常のファイルが存在するか」を確認する。ディレクトリの存在確認には -d を使う
  7. ○ ―― for ループは in の後に並べた値を順に変数に代入して処理を繰り返す
  8. ○ ―― export なしの変数(シェル変数)は子プロセスに引き継がれないが、export で設定した環境変数は引き継がれる

まとめ

今回はシェルスクリプトの基礎を学びました。

  • 環境変数 PATH、HOME、LANG の役割を理解し、echoenv で確認した
  • .bash_profile と .bashrc の違いを知り、環境変数を永続化するには .bashrc に書くことを学んだ
  • シバン #!/bin/bash でスクリプトの実行プログラムを指定し、chmod +x で実行権限を付与した
  • 変数の定義では = の前後にスペースを入れない。$() でコマンドの実行結果を取得できる
  • if/then/fi で条件分岐を書き、[ ](test コマンド)でファイル存在チェックや数値比較を行った
  • for ループでリストを順に処理し、while ループで条件が成立する間繰り返した
  • for ループと if 文を組み合わせて、複数サービスの一括チェックスクリプトを作成した

今回のスクリプトは十数行程度のものでしたが、実務ではこの規模のスクリプトが最も多く使われます。数百行の大きなスクリプトよりも、10〜30行の小さなスクリプトを目的ごとに作るのが現場での一般的なスタイルです。

次回の第15回「フェーズ2まとめ演習」では、フェーズ2で学んだ全知識(ファイル操作、テキスト処理、vi、ユーザー管理、パーミッション、プロセス管理、systemd、シェルスクリプト)を組み合わせた横断課題に挑戦します。ユーザー作成からパーミッション設定、サービス起動確認、結果のファイル出力まで、一連の作業を通して実行します。

シリーズ一覧

フェーズ1: エンジニアのいろは(第1回〜第3回)

フェーズ2: Linux基礎(第4回〜第15回)

フェーズ3: ネットワークとインフラ基盤(第16回〜第27回)

フェーズ4: サーバー構築と運用(第28回〜第36回)