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

シェルスクリプト実践 フェーズ3まとめ演習

Linuxエンジニア養成講座 第26回|全36回・フェーズ3「ネットワークとインフラ基盤」の11回目(11/12回目)です。
前回まで: 第16回でTCP/IPの基礎、第17回でnmcliによるIP設定と疎通確認、第18回でプロキシ・DNS・NTPのクライアント設定、第19回でパッケージ管理、第20回でfirewalldによる通信制御、第21回第22回で発展トピック(ボンディング・VLAN)、第23回でログ管理、第24回でcron / systemd timer、第25回でLVMによるストレージ管理を学びました。
今回学ぶこと: フェーズ3のまとめ演習として、シェルスクリプトで実務的な自動化を実践します。

前回の予告で「ネットワーク疎通チェックやログ解析、ディスク使用率チェックなどをシェルスクリプトで自動化します。df の出力をスクリプトで解析する場面も登場します」とお伝えしました。今回はその内容に加えて、awk の発展的な使い方やスクリプトのデバッグ手法も取り上げます。フェーズ3で学んだ知識を横断的に使う「まとめ演習」の位置づけです。

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

  • ping による疎通チェックを配列とループで自動化するスクリプトを書ける
  • df と awk を組み合わせてディスク使用率を閾値判定するスクリプトを段階的に構築できる
  • grep / awk / sort / uniq -c を組み合わせたログ集計のパイプラインを書ける
  • bash -x や set -e を使ってスクリプトのデバッグができる

この回の進め方

今回は3つの実践スクリプトを作成・実行します。各スクリプトが「フェーズ3のどの回の知識を使っているか」を明示しますので、つまずいた箇所があれば該当回に戻って復習してください。末尾に「つまずいた場合の復習ガイド」も用意しています。

スクリプト内容使う知識
1ネットワーク疎通チェック第16回(ping)、第14回(配列・for・if)
2ディスク使用率チェック第25回(df)、第8回(awk・パイプ)、第14回(while read・変数)
3ログ解析第23回(/var/log/secure)、第8回(grep・awk・sort・uniq)

すべて alma-main で実行します。SSH で接続してください。

スクリプト1: ネットワーク疎通チェック

インフラエンジニアの仕事で「サーバーが応答しない」という問い合わせは日常的に発生します。そのとき最初に行うのが ping による疎通確認です。第16回で手動で ping を打つ方法を学びましたが、チェック対象が10台、20台と増えると手作業では時間がかかります。しかし、手作業の問題は時間だけではありません。人間が毎回同じ手順を正確に繰り返すことは困難です。スクリプト化することで、ヒューマンエラーを排除し、再現可能な手順をチーム内で共有できます。ここではスクリプトで自動化する方法を学びます。

第14回で学んだ配列と for ループ、if 条件分岐を組み合わせます。vi でスクリプトファイルを作成してください。alma-mainで実行します。

実行コマンド:

$ vi /tmp/check_ping.sh

以下の内容を入力してください。

#!/bin/bash
TARGETS=("10.0.1.1" "10.0.1.3" "10.0.1.254" "10.0.1.99")
for ip in "${TARGETS[@]}"; do
    if ping -c 1 -W 2 "$ip" > /dev/null 2>&1; then
        echo "[OK]   $ip"
    else
        echo "[FAIL] $ip"
    fi
done

各行の意味を確認します。

  • #!/bin/bash — シバン行。このスクリプトを bash で実行することを宣言します(第14回で学習済み)
  • TARGETS=(“10.0.1.1” …) — 配列にチェック対象のIPアドレスを格納します。10.0.1.1 は alma-main 自身、10.0.1.3 は alma-sub、10.0.1.254 は alma-proxy、10.0.1.99 は存在しないアドレス(失敗テスト用)です
  • “${TARGETS[@]}” — 配列の全要素を展開します。ダブルクォートで囲むのは、要素にスペースが含まれる場合の安全策です
  • ping -c 1 -W 2 — 1回だけ ping を送信し、2秒でタイムアウトします。-c 1 がないと ping は止まりません
  • > /dev/null 2>&1 — ping の標準出力と標準エラー出力を /dev/null に捨てます(第8回で学んだリダイレクト)。スクリプトの出力を [OK] / [FAIL] だけにするためです
  • if … then … else … fi — ping の終了ステータス(成功=0、失敗=1)で分岐します

ファイルを保存したら、実行権限を付与して実行します。alma-mainで実行してください。

実行コマンド:

$ chmod +x /tmp/check_ping.sh

実行コマンド:

$ /tmp/check_ping.sh

実行結果:

[OK]   10.0.1.1
[OK]   10.0.1.3
[OK]   10.0.1.254
[FAIL] 10.0.1.99

10.0.1.99 は存在しないアドレスなので [FAIL] になります。実際の現場では、この結果をメールやチャットに通知する仕組みと組み合わせて使います。

配列や for ループの構文をもっと詳しく知りたい場合は man bash の「Arrays」や「Compound Commands」のセクションを参照してください。

スクリプト2: ディスク使用率チェック

もしディスク使用率のチェックを誰もしていない状態で、ある日突然サービスが停止したら何が起きるでしょうか。第6回で学んだ /var/log 肥大化のヒヤリハットを思い出してから読み進めてください。

サーバー運用で「ディスクが満杯になってサービスが止まった」というトラブルは非常に多く発生します。前回の LVM で「容量が足りなくなったら拡張する」方法を学びましたが、そもそも「容量が足りなくなりそうだ」と気づくためにはディスク使用率を定期的にチェックする必要があります。ディスクが満杯になるのは深夜かもしれません。人間が24時間監視し続けることはできません。スクリプトによる定期チェックは、人間の代わりにサーバーを見守る仕組みです。

ここでは df コマンドの出力を awk で加工し、閾値を超えたマウントポイントを検出するスクリプトを段階的に作っていきます。

Step1: df + awk で使用率だけ抽出する

まずは完成形を作る前に、df の出力から必要な情報だけを取り出すワンライナーを確認します。第8回で学んだ awk を使います。alma-mainで実行してください。

実行コマンド:

$ df -h | awk 'NR>1 {print $5, $6}'

実行結果:

0% /dev
0% /dev/shm
2% /run
1% /sys/firmware/efi/efivars
4% /
21% /boot
2% /boot/efi
1% /home
0% /run/user/1000

NR>1 は awk の発展的な使い方です。NR は awk が処理している「行番号」を表す組み込み変数で、NR>1 は「2行目以降だけ処理する」という意味です。これにより df のヘッダ行(Filesystem Size Used …)をスキップできます。$5 が使用率(%)、$6 がマウントポイントです。

NR の詳細は man awk の「Built-in Variables」セクションで確認できます。

Step2: while read で1行ずつ処理する

次に、抽出した各行をシェルスクリプトで1行ずつ処理します。第14回で学んだ while read を使います。alma-mainで実行してください。

実行コマンド:

$ df -h | awk 'NR>1 {print $5, $6}' | while read pcent mount; do echo "使用率: $pcent マウントポイント: $mount"; done

実行結果:

使用率: 0% マウントポイント: /dev
使用率: 0% マウントポイント: /dev/shm
使用率: 2% マウントポイント: /run
使用率: 1% マウントポイント: /sys/firmware/efi/efivars
使用率: 4% マウントポイント: /
使用率: 21% マウントポイント: /boot
使用率: 2% マウントポイント: /boot/efi
使用率: 1% マウントポイント: /home
使用率: 0% マウントポイント: /run/user/1000

while read pcent mount は、パイプから渡された各行を空白で区切り、1つ目を pcent、2つ目を mount に代入します。df の出力をスクリプトで扱える形にできました。

Step3: 閾値比較を追加して完成

最後に閾値との比較を加え、スクリプトファイルとして完成させます。引数で閾値を変更できるようにします。vi でスクリプトを作成してください。alma-mainで実行します。

実行コマンド:

$ vi /tmp/check_disk.sh

以下の内容を入力してください。

#!/bin/bash
THRESHOLD=${1:-80}
echo "閾値: ${THRESHOLD}%"
df -h --output=pcent,target | tail -n +2 | while read pcent mount; do
    usage=${pcent%%%}
    if [ "$usage" -ge "$THRESHOLD" ] 2>/dev/null; then
        echo "[WARN] $mount: ${pcent} (閾値${THRESHOLD}%超過)"
    fi
done
echo "チェック完了"

各行の意味を確認します。

  • ${1:-80} — スクリプトの第1引数を使い、引数がなければデフォルト値 80 を使います。第14回で学んだ特殊変数 $1 とデフォルト値構文 ${変数:-デフォルト} の組み合わせです
  • df -h –output=pcent,target — df の出力を使用率(pcent)とマウントポイント(target)だけに絞ります。Step1 では awk でフィールドを抽出しましたが、df 自体にも出力列を選択するオプションがあります
  • tail -n +2 — 先頭1行(ヘッダ行)をスキップします。awk の NR>1 と同じ効果です
  • ${pcent%%%} — パラメータ展開で % 記号を除去します。「21%」から「21」を取り出して数値比較できるようにするためです。%% は「末尾から最長一致で削除」、削除パターンが % です
  • [ “$usage” -ge “$THRESHOLD” ] — 数値比較です。-ge は「以上(greater than or equal)」を意味します
  • 2>/dev/null — 空行やヘッダの残りで数値比較が失敗した場合のエラーメッセージを抑制します

実行権限を付与して、まずデフォルトの閾値80%で実行します。alma-mainで実行してください。

実行コマンド:

$ chmod +x /tmp/check_disk.sh

実行コマンド:

$ /tmp/check_disk.sh

実行結果:

閾値: 80%
チェック完了

現在は全マウントポイントが 80% 未満のため、警告は表示されません。スクリプトが正常に動いているか確認するため、閾値を 1% に下げて実行してみます。

実行コマンド:

$ /tmp/check_disk.sh 1

実行結果:

閾値: 1%
[WARN] /run: 2% (閾値1%超過)
[WARN] /sys/firmware/efi/efivars: 1% (閾値1%超過)
[WARN] /: 4% (閾値1%超過)
[WARN] /boot: 21% (閾値1%超過)
[WARN] /boot/efi: 2% (閾値1%超過)
[WARN] /home: 1% (閾値1%超過)
チェック完了

閾値 1% にしたことで、使用率が 1% 以上のマウントポイントがすべて検出されました。引数を変えるだけで閾値を調整できることが確認できます。

このスクリプトを 第24回で学んだ cron で定期実行すれば、ディスク容量の簡易監視が実現できます。第32回では Prometheus という本格的な監視ツールを導入しますが、「まず自分でスクリプトを書いて監視の仕組みを理解する」ことが、ツールを使いこなすための土台になります。

awk の発展: printf によるフォーマット出力

第8回では awk の基本($1, $2 でフィールドを参照して print で出力)を学びました。awk にはさらに printf という、出力の桁揃えや書式指定ができる機能があります。alma-mainで実行してください。

実行コマンド:

$ df -h | awk 'NR>1 {printf "%-30s %s/%s (%s)\n", $6, $3, $2, $5}'

実行結果:

/dev                           0/4.0M (0%)
/dev/shm                       0/2.0G (0%)
/run                           9.4M/783M (2%)
/sys/firmware/efi/efivars      33K/128M (1%)
/                              2.2G/64G (4%)
/boot                          199M/960M (21%)
/boot/efi                      7.1M/599M (2%)
/home                          254M/31G (1%)
/run/user/1000                 0/392M (0%)

printf の書式指定を説明します。

  • %-30s — 文字列を30文字幅で左寄せ(- が左寄せ指定)して出力します。これにより列が揃います
  • %s — 文字列をそのまま出力します
  • \n — 改行です。printf は print と違い、自動で改行しないため明示が必要です

printf の書式指定は C 言語に由来する記法です。すべてを覚える必要はありません。「桁揃えしたいときに printf を使う」ことだけ覚えておけば、具体的な書式は man awk で都度確認できます。

awk にはもう1つ、フィールドの区切り文字を変更する -F オプションがあります。デフォルトでは空白やタブで区切りますが、例えば -F: を指定すると : で区切ります。/etc/passwd のようなコロン区切りのファイルを処理するときに使います。

スクリプト3: ログ解析

不正アクセスの兆候を、管理者が気づいたときには手遅れかもしれません。ログを定期的に集計するスクリプトがあれば、異変を早期に発見できます。

第23回でログファイルの構造と journalctl / rsyslog を学びました。ログファイルには膨大な情報が記録されており、人間が目で追うには量が多すぎます。ここでは 第8回で学んだテキスト処理コマンドを組み合わせて、ログから有用な情報を集計する方法を学びます。

SSH ログインユーザー別の集計

セキュリティの観点から「誰がいつログインしたか」を把握することは重要です。/var/log/secure にはSSH認証の記録が残っています。ここからログイン成功の記録を抽出し、ユーザーごとの回数を集計します。alma-mainで実行してください。

実行コマンド:

$ sudo grep "Accepted" /var/log/secure | awk '{print $9}' | sort | uniq -c | sort -rn

実行結果:

     62 developer

このパイプラインの各段階を分解します。

  1. grep “Accepted” — ログイン成功の行だけ抽出します(失敗は「Failed」)
  2. awk ‘{print $9}’ — ログの9番目のフィールド(ユーザー名)を取り出します
  3. sort — ユーザー名をアルファベット順に並べ替えます。次の uniq -c が正しく動くために必要です
  4. uniq -c — 連続する同じ行をまとめ、出現回数を付加します
  5. sort -rn — 回数の多い順に並べ替えます(-r: 降順、-n: 数値として比較)

この sort | uniq -c | sort -rn は「集計の定番パイプライン」です。ログ解析に限らず、「何かの出現回数を数えて多い順に並べる」場面で広く使います。覚えておいて損はありません。

集計の定番パイプラインのデータ変換フロー。grep でキーワード行を抽出し、awk でユーザー名列だけを取り出し、sort でアルファベット順に並べ、uniq -c で連続する同じ行を数え、sort -rn で多い順に並べ替える。各段階の出力例を示す

引数でファイルとキーワードを受け取るスクリプト

上のワンライナーを汎用的なスクリプトにしてみます。対象のログファイルと検索キーワードを引数で指定できるようにします。vi でスクリプトを作成してください。alma-mainで実行します。

実行コマンド:

$ vi /tmp/count_log.sh

以下の内容を入力してください。

#!/bin/bash
LOGFILE=${1:-/var/log/secure}
KEYWORD=${2:-Accepted}
echo "対象: $LOGFILE キーワード: $KEYWORD"
COUNT=$(sudo grep "$KEYWORD" "$LOGFILE" | wc -l)
echo "${COUNT} 件"

各行の意味を確認します。

  • ${1:-/var/log/secure} — 第1引数がなければ /var/log/secure をデフォルトにします
  • ${2:-Accepted} — 第2引数がなければ Accepted をデフォルトにします
  • $(…) — コマンド置換です。grep の結果を wc -l で行数に変換し、変数 COUNT に代入します

実行権限を付与して実行します。alma-mainで実行してください。

実行コマンド:

$ chmod +x /tmp/count_log.sh

まず引数なしで実行し、デフォルト値が使われることを確認します。

実行コマンド:

$ /tmp/count_log.sh

実行結果:

対象: /var/log/secure キーワード: Accepted
62 件

次に引数を指定して、/var/log/messages から NetworkManager の出現回数を数えてみます。

実行コマンド:

$ /tmp/count_log.sh /var/log/messages NetworkManager

実行結果:

対象: /var/log/messages キーワード: NetworkManager
1096 件

引数を変えるだけで、異なるログファイルや異なるキーワードに対応できます。第36回のトラブルシューティング演習でも、このようなログ解析が調査の起点になります。

スクリプトのデバッグ

スクリプトを書いていると「思った通りに動かない」という場面に必ず遭遇します。そのときに役立つデバッグの手法を2つ紹介します。

bash -x でトレース実行

bash -x を使うと、スクリプトの各行がどのように展開・実行されるかを確認できます。変数がどんな値に展開されたか、条件分岐のどちら側に入ったかが一目で分かります。alma-mainで実行してください。

実行コマンド:

$ bash -x /tmp/check_ping.sh

実行結果:

+ TARGETS=("10.0.1.1" "10.0.1.3" "10.0.1.254" "10.0.1.99")
+ for ip in "${TARGETS[@]}"
+ ping -c 1 -W 2 10.0.1.1
+ echo '[OK]   10.0.1.1'
[OK]   10.0.1.1
+ for ip in "${TARGETS[@]}"
+ ping -c 1 -W 2 10.0.1.3
+ echo '[OK]   10.0.1.3'
[OK]   10.0.1.3
...

行頭の + が付いた行がトレース出力です。変数 ${TARGETS[@]} が実際の IP アドレスに展開されている様子、ping コマンドが実行されている様子が見えます。「変数に想定外の値が入っていた」「条件分岐が期待と逆に動いた」といった問題を発見するのに有効です。

set -e でエラー時に即停止

シバン行の直後に set -e を書くと、コマンドが失敗(終了ステータスが0以外)した時点でスクリプトが即座に停止します。

#!/bin/bash
set -e

set -e がないと、途中のコマンドが失敗しても後続の処理が実行され続けます。例えば「ファイルのコピーに失敗したのに、古いファイルを削除してしまった」という事態が起こり得ます。本番で使うスクリプトには set -e を入れる習慣をつけてください。

bash のデバッグ機能やオプションの詳細は man bash で確認できます。また、組み込みコマンド(set, read, echo など)のヘルプは help set のように help コマンドで確認できます。

ヒヤリハット: スクリプト運用で起きがちなトラブル

ヒヤリハット1: chmod +x を忘れて「Permission denied」

スクリプトを書いて意気揚々と実行したら bash: ./check_ping.sh: Permission denied — これは誰もが1度は経験するミスです。第11回で学んだ通り、ファイルには実行権限(x)が必要です。ls -l でパーミッションを確認し、chmod +x で実行権限を付与してください。なお、bash /tmp/check_ping.sh のように bash コマンドの引数として渡す場合は実行権限がなくても動きますが、./check_ping.sh/tmp/check_ping.sh のように直接実行する場合は実行権限が必須です。

ヒヤリハット2: cron からスクリプトを実行したら動かない

第24回で学んだ cron の落とし穴の復習です。ターミナルで手動実行すると正常に動くスクリプトが、cron から実行すると「コマンドが見つからない」とエラーになることがあります。原因は PATH 環境変数の違いです。ログインシェルでは /usr/local/bin や /usr/bin が PATH に含まれますが、cron の実行環境ではごく限られたパスしか設定されていません。対策として、スクリプト内でコマンドをフルパス(/usr/bin/df など)で書くか、スクリプトの冒頭で PATH=/usr/local/bin:/usr/bin:/bin のように PATH を明示的に設定してください。

やってみよう

ここまでの内容を踏まえて、以下の3つの課題に取り組んでください。alma-mainで実行します。

課題1: スクリプト2(check_disk.sh)の閾値を引数で変更できることを確認してください。閾値を 5 に設定して実行し、どのマウントポイントが検出されるか確認してください。

実行コマンド:

$ /tmp/check_disk.sh 5

閾値 5% の場合、使用率 5% 以上のマウントポイントが [WARN] として表示されるはずです。/boot(21%)が検出されることを確認してください。

課題2: /var/log/messages から「NetworkManager」の出現回数を集計するワンライナーを書いてください。sort | uniq -c | sort -rn パイプラインは使わず、grep と wc -l で件数だけを表示する方法で構いません。

ヒント: sudo grep "キーワード" ログファイル | wc -l の形です。

課題3(チャレンジ): check_ping.sh の結果をログファイルに記録するスクリプトを書いてみてください。要件は以下の4つです。(1) 実行日時をログの先頭に記録する (2) 各ホストの結果(OK/FAIL)を記録する (3) FAILがあった場合は最後に警告メッセージを表示する (4) ログファイルのパスは /tmp/ping_report.log とする。ヒント: 第8回で学んだリダイレクト(>>)と第14回のコマンド置換($(date))を組み合わせます。自分で書いてから、以下の解答例を確認してください。

課題3 解答例:

#!/bin/bash
LOGFILE="/tmp/ping_report.log"
TARGETS=("10.0.1.1" "10.0.1.3" "10.0.1.254" "10.0.1.99")
FAIL_COUNT=0

echo "=== 疎通チェック $(date '+%Y-%m-%d %H:%M:%S') ===" >> "$LOGFILE"
for ip in "${TARGETS[@]}"; do
    if ping -c 1 -W 2 "$ip" > /dev/null 2>&1; then
        echo "[OK]   $ip" >> "$LOGFILE"
    else
        echo "[FAIL] $ip" >> "$LOGFILE"
        FAIL_COUNT=$((FAIL_COUNT + 1))
    fi
done
if [ "$FAIL_COUNT" -gt 0 ]; then
    echo "[WARN] ${FAIL_COUNT} 台で疎通失敗" >> "$LOGFILE"
    echo "[WARN] ${FAIL_COUNT} 台で疎通失敗 — 詳細は $LOGFILE を確認"
fi

ポイントは >>(追記リダイレクト)を使うことで、実行するたびにログが蓄積される点です。>(上書きリダイレクト)にすると毎回ログが消えてしまいます。FAIL_COUNT 変数でエラー数を数え、0より大きい場合だけ警告を表示する仕組みです。

演習が完了したら、作成したスクリプトファイルを削除してください。

実行コマンド:

$ rm /tmp/check_ping.sh /tmp/check_disk.sh /tmp/count_log.sh /tmp/ping_report.log

つまずいた場合の復習ガイド

今回は複数の回で学んだ知識を組み合わせて使いました。つまずいた箇所があれば、以下の表から該当する回に戻って復習してください。

つまずいたトピック該当回リンク
パイプ、リダイレクト、grep、awk、sort、uniq第8回テキスト処理・パイプとリダイレクト
パーミッション、chmod第11回パーミッションと所有権
シバン行、変数、配列、for、if、while read第14回シェルスクリプト入門
ping、IPアドレス、ネットワーク疎通第16回ネットワーク基礎
ログファイル(/var/log/secure、/var/log/messages)第23回ログ管理
cron、PATH 環境変数第24回cron / systemd timer
df、マウントポイント、ディスク使用率第25回ストレージ管理(LVM)

まとめと次回予告

今回はフェーズ3のまとめ演習として、3つの実践スクリプトを作成しました。

  • ping による疎通チェックスクリプトで、配列・ループ・条件分岐・リダイレクトを組み合わせる方法を学んだ
  • df の出力を awk と while read で加工し、閾値判定で異常を検出するスクリプトを段階的に構築した
  • grep / sort / uniq -c / sort -rn の「集計の定番パイプライン」でログを分析する方法を学んだ

これらのスクリプトを 第24回で学んだ cron で定期実行すれば、手作業なしでサーバーの状態を継続的にチェックする簡易監視が実現できます。フェーズ3で学んだネットワーク・ストレージ・ログ・定期実行の知識が、スクリプトという形で1つにつながったことを感じ取ってもらえれば幸いです。

次回の第27回「SSH応用」では、多段SSH(ProxyJump)による alma-main 経由での alma-sub 接続や、sshd 設定のハードニング、tmux によるセッション管理を学びます。フェーズ3の最終回です。

理解度チェック

今回の内容を振り返り、○×で答えてください。

Q1. ping -c 1 -W 2 は「1回だけ ping を送信し、2秒でタイムアウトする」という意味である。

Q2. awk の NR は「現在処理している行の行番号」を表す組み込み変数である。

Q3. sort | uniq -c のパイプラインでは、uniq -c の前に sort をしなくても正しく集計できる。

Q4. ${1:-80} は「第1引数が指定されていれば使い、なければ 80 をデフォルト値とする」という意味である。

Q5. bash -x でスクリプトを実行すると、各行がどう展開・実行されたかをトレース出力できる。

Q6. set -e をスクリプトに記述すると、コマンドが失敗してもスクリプトの実行を続行する。

以下、解答です。

Q1. ○ — -c 1 は送信回数を1回に制限し、-W 2 はタイムアウトを2秒に設定します。スクリプトで使う場合は -c を指定しないと ping が終了せず、スクリプトが先に進みません。

Q2. ○ — NR は Number of Records の略で、awk が処理している行番号を保持します。NR>1 とすれば1行目(ヘッダ行)をスキップできます。

Q3. × — uniq は「連続する同じ行」をまとめるコマンドです。事前に sort で同じ値を隣り合わせにしておかないと、離れた位置にある同じ値は別カウントになります。

Q4. ○ — これはシェルのデフォルト値構文です。$1 が未設定または空文字の場合に 80 が使われます。スクリプトの引数を省略可能にするときに便利です。

Q5. ○ — bash -x は各行の実行前に、変数展開後のコマンドを + 記号付きで表示します。変数の値が想定通りか、条件分岐のどちら側に入ったかを確認できます。

Q6. × — set -e は逆の動作です。コマンドが失敗(終了ステータスが0以外)した時点でスクリプトを即座に停止します。意図しないエラーを見過ごさないための安全策です。

シリーズ一覧

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

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

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

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