簡単なシェルスクリプトの書き方|自動化の第一歩
シェルスクリプトは、ターミナルで毎回手で打っている操作を、そのまま手順書のように保存して再実行できるのが強みです。ファイル整理、ログ確認、バックアップ、CSVの前処理など、実務の小さな繰り返し作業を減らす入口として使いやすい方法です。
特に最初の一歩では、難しい構文を覚えるより、コマンドを順番に並べるところから始めるのが近道です。まずは「昨日のログをまとめて確認する」「作業用フォルダを一気に作る」といった、1分で終わるけれど毎日やる処理を自動化すると効果が見えやすくなります。
- できること: 複数コマンドの連続実行、定型作業の自動化、簡単な条件分岐
- 向いている場面: ファイル操作、ログ確認、バックアップ、CLIツールの定型実行
- 対象読者: Linux/macOS のターミナル操作を少し触ったことがある初心者
- 前提環境: Bash を想定。
bash --versionで確認可能
ここがポイント: 最初は「bashの高度な文法」を学ぶより、今やっている手作業を3行から10行に置き換えるほうが実務では役に立ちます。
まず知っておきたい前提
シェルスクリプトは、シェルに実行させるテキストファイルです。この記事では Bash を前提に進めます。
対象環境
- OS: Linux、macOS
- シェル: Bash
- 実行例ファイル名:
sample.sh
sh と bash は同じではありません。ネット上の例をそのまま使うと、bash では動くのに sh ではエラーになることがあります。最初は Bash に寄せて書くほうが混乱しにくいです。
最低限の流れ
シェルスクリプトは、基本的に次の流れで使います。
- テキストファイルを作る
- 先頭に
#!/bin/bashを書く - 実行したいコマンドを並べる
- 実行権限を付ける
- 実行する
いちばん簡単な書き方
まずは最小構成です。hello.sh という名前で保存します。
#!/bin/bash
echo "シェルスクリプトのテストです"
date
pwd
この3行でやっていることは単純です。
echo: 文字を表示するdate: 現在日時を表示するpwd: 今いるディレクトリを表示する
実行方法
chmod +x hello.sh
./hello.sh
出力例
シェルスクリプトのテストです
Tue Apr 21 14:20:00 JST 2026
/home/user/work
この段階で大事なのは、ターミナルで成功したコマンドを、そのまま上から順に並べてもスクリプトになると理解することです。
実務で使いやすい最小サンプル
ここでは、作業開始前によくある「フォルダ作成」と「メモファイル準備」を自動化します。
#!/bin/bash
mkdir -p work/logs
mkdir -p work/output
touch work/logs/today.log
echo "作業開始: $(date '+%Y-%m-%d %H:%M:%S')" >> work/logs/today.log
printf "準備が完了しました\n"
何が便利か
毎回手でやると、次のような操作が発生します。
- フォルダを作る
- ログファイルを作る
- 開始時刻を書き残す
これを1回の実行にまとめられます。新人教育や手順の標準化でも有効です。人によって作業開始の流れがぶれにくくなるからです。
出力例
準備が完了しました
作られるもの:
work/logs/work/output/work/logs/today.log
よく使う基本構文
シェルスクリプトは、最初から全部覚える必要はありません。まずは次の3つでかなり書けます。
変数
#!/bin/bash
NAME="sales.csv"
echo "対象ファイル: $NAME"
ポイントは、= の前後にスペースを入れないことです。
引数
実行時に値を渡したいときは引数を使います。
#!/bin/bash
echo "1つ目の引数: $1"
echo "2つ目の引数: $2"
実行例:
./args.sh report.csv 2026-04
出力例:
1つ目の引数: report.csv
2つ目の引数: 2026-04
ファイル名や日付を毎回変えたい処理では、引数にしておくと使い回しやすくなります。
条件分岐
#!/bin/bash
if [ -f "$1" ]; then
echo "ファイルがあります"
else
echo "ファイルがありません"
fi
-f は「通常ファイルが存在するか」を調べます。バックアップ前の存在確認や、入力ファイルのチェックでよく使います。
入力例と出力例つきのサンプル
実務でありがちな「CSVファイルがあるときだけ処理する」例です。
#!/bin/bash
INPUT_FILE="$1"
OUTPUT_DIR="output"
if [ -z "$INPUT_FILE" ]; then
echo "使い方: ./check_csv.sh <csvファイル名>"
exit 1
fi
if [ ! -f "$INPUT_FILE" ]; then
echo "ファイルが見つかりません: $INPUT_FILE"
exit 1
fi
mkdir -p "$OUTPUT_DIR"
cp "$INPUT_FILE" "$OUTPUT_DIR/"
echo "コピー完了: $OUTPUT_DIR/$INPUT_FILE"
実行例
./check_csv.sh sales.csv
出力例
コピー完了: output/sales.csv
この例で押さえたい点
- 引数がないときは使い方を表示する
- 入力ファイルがなければ止める
- 出力先フォルダがなければ作る
- 問題がなければコピーする
「エラー時に早く止める」書き方は、後から保守しやすくなります。
どんな場面で使えるか
シェルスクリプトは、派手な処理よりも、地味な繰り返し作業で効果が出ます。
使いどころの例
- ログをまとめて確認する
- バックアップ用にファイルをコピーする
- 複数ディレクトリを一気に作る
grepやawk、sedを順番に実行する- 定型コマンドを1本にまとめる
たとえば、毎朝やっているログ確認なら、次のように書けます。
#!/bin/bash
echo "error を含む行を確認します"
grep -i "error" app.log | tail -n 20
短いですが、これだけでも「コマンドを思い出す時間」と「打ち間違い」を減らせます。
初心者がつまずきやすいポイント
ここは実務で差が出やすい部分です。シェルスクリプトは少しの書き方の差で、動いたり壊れたりします。
変数をダブルクォートで囲わない
NG例:
cp $FILE backup/
改善例:
cp "$FILE" backup/
ファイル名に空白が入ると、NG例は意図しない分割が起きます。変数は基本的に "$変数名" で囲うと覚えておくと安全です。
sh script.sh で実行してしまう
Bash 用に書いたスクリプトを sh script.sh で動かすと、環境によってはエラーになります。
実行は次のどちらかにそろえるのが無難です。
bash script.shchmod +x script.shのあと./script.sh
エラー時に続行してしまう
最初のうちは、途中で失敗しても最後まで進んでしまい、どこで壊れたか分からなくなりがちです。
必要に応じて、先頭に次の設定を入れる方法があります。
set -euo pipefail
ただし、挙動を理解しないまま入れると「なぜ止まったか」が分かりにくいこともあります。初心者なら、まずは if で確認しながら書き、慣れてから取り入れるほうが扱いやすいです。
まず覚えたい改善パターン
スクリプトが少し長くなってきたら、次の改善を意識すると読みやすくなります。
コメントを短く入れる
#!/bin/bash
# 出力先を準備
mkdir -p output
# 元ファイルをコピー
cp "$1" output/
メッセージを出して処理を見える化する
echo "CSVをコピーしています..."
処理中の見通しがよくなり、失敗した位置も追いやすくなります。
役割ごとにまとまりを作る
- 入力チェック
- フォルダ準備
- 本処理
- 終了メッセージ
この順で並べるだけでも、後から修正しやすくなります。
代替手段と使い分け
シェルスクリプトは万能ではありません。処理の内容によっては別の手段のほうが向いています。
シェルスクリプトが向く場面
- OSコマンドをつなげたい
- ファイル操作が中心
- すぐ試したい
- Linux/macOS のCLI環境で完結する
Python など別言語が向く場面
- 複雑な文字列処理が多い
- JSON や CSV を本格的に扱う
- 条件分岐や例外処理が増える
- 保守対象として長く育てる
短い自動化ならシェルスクリプト、ロジックが重くなったら Python や Node.js に移す、という分け方は実務でも自然です。
最初に作るなら、どんなスクリプトがよいか
迷ったら、次のどれかを題材にすると失敗しにくいです。
- 作業用フォルダを作るスクリプト
- ログの末尾20行を表示するスクリプト
- バックアップ先へコピーするスクリプト
- 日付つきファイル名を作るスクリプト
どれも短く書けて、手元ですぐ試せます。特に、今週すでに3回以上やった作業を選ぶと、自動化の価値が見えやすくなります。
まとめ
シェルスクリプトの最初の書き方は、難しく考えなくて大丈夫です。#!/bin/bash を書き、成功したコマンドを順番に並べ、必要なら引数と条件分岐を足していく。それだけで、日々の小さな反復作業はかなり減らせます。
最後に見るべきポイントを絞ると、次の3つです。
- まずは3行から10行の小さな自動化で始める
- 変数はダブルクォートで囲う
- 複雑になったら Python など別の選択肢も検討する
次に試すなら、毎朝のログ確認か、定型バックアップのスクリプト化が扱いやすい題材です。そこで引っかかったら、if による存在確認と引数の受け取りを追加していくと、実務で使える形に一段進みます。
