本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。
第24回 総合演習:バックアップ用スクリプトを作ろう | はじめてのシェルスクリプト

はじめてのシェルスクリプト | 第24回
はじめに
この連載では、macOS のターミナルで sh を使いながら、シェルスクリプトの基本を順番に学んでいきます。
第1回から第23回まで、シェルスクリプトの基本をひとつひとつ積み上げてきました。変数・クォート・引数・入力・条件分岐・ループ・関数・ファイル判定・リダイレクト・コマンド置換——これらすべてが、実用的なスクリプトを書くための道具です。
最終回となる第24回では、学んだ内容を総動員して「バックアップ用スクリプト」を一から作ります。引数でコピー元とコピー先を受け取り、ディレクトリの存在を確認し、日付付きの名前でバックアップを保存する——という一連の流れを、これまでの知識を組み合わせながら実装します。
「シェルスクリプトで自分の作業を自動化できた」という体験を、ここで一緒に完成させましょう。この連載の締めくくりにふさわしい実践課題で、学んできた力を確かめてください。
この回で学ぶこと
- 引数を受け取って使う方法
- ファイルやディレクトリの存在確認
- バックアップ先ディレクトリを作る方法
- 日付入りの名前を付ける方法
cpと条件分岐を組み合わせる方法- 安全に実行しやすい形でまとめる方法
- 小さな実用スクリプトを完成させる流れ
今回作るスクリプトの内容
何をするスクリプトか
今回のスクリプトは、引数で指定したファイルまたはディレクトリを、backup ディレクトリの中へ日付付きの名前でコピーします。
元のファイルやディレクトリは削除せず、コピーだけを行います。
これまでの内容をどう使うか
このスクリプトでは、引数、変数、条件分岐、コマンド置換、ファイル確認、ディレクトリ作成をまとめて使います。
連載で学んだ基本を小さな実用例として組み合わせる形です。
サンプルコード
backup_script.sh に次の内容を保存します。
#!/bin/sh
target="$1"
backup_dir="backup"
today=$(date +%Y%m%d)
if [ -z "$target" ]; then
echo "使い方: sh backup_script.sh ファイル名またはディレクトリ名"
exit 1
fi
if [ ! -e "$target" ]; then
echo "指定した対象が見つかりません: $target"
exit 1
fi
mkdir -p "$backup_dir"
base_name=$(basename "$target")
destination="$backup_dir/${base_name}_$today"
cp -R "$target" "$destination"
echo "バックアップが完了しました"
echo "保存先: $destination"
実行手順
1. バックアップ対象を用意する
まず、同じディレクトリに sample.txt のようなファイルを作成します。
内容は簡単な文字列でかまいません。
backup test2. スクリプトを作成して保存する
エディタで backup_script.sh という名前のファイルを作成し、次の内容を保存します。
#!/bin/sh
target="$1"
backup_dir="backup"
today=$(date +%Y%m%d)
if [ -z "$target" ]; then
echo "使い方: sh backup_script.sh ファイル名またはディレクトリ名"
exit 1
fi
if [ ! -e "$target" ]; then
echo "指定した対象が見つかりません: $target"
exit 1
fi
mkdir -p "$backup_dir"
base_name=$(basename "$target")
destination="$backup_dir/${base_name}_$today"
cp -R "$target" "$destination"
echo "バックアップが完了しました"
echo "保存先: $destination"3. スクリプトを実行する
次のコマンドを実行します。
sh backup_script.sh sample.txt実行結果の例です。
バックアップが完了しました
保存先: backup/sample.txt_20260424日付部分は実行した日によって変わります。
コードの読み方
target=”$1″
1番目の引数を target に入れています。
この値が、バックアップしたいファイル名またはディレクトリ名になります。
today=$(date +%Y%m%d)
date コマンドの結果を使って、20260424 のような日付を作っています。
バックアップ名に日付を付けることで、いつ作成したか分かりやすくなります。
if [ -z “$target” ]; then
引数が空かどうかを確認しています。
引数なしで実行した場合は、使い方を表示して終了します。
if [ ! -e “$target” ]; then
指定した対象が存在するか確認しています。
存在しないまま cp を実行しないようにしています。
mkdir -p “$backup_dir”
バックアップ先ディレクトリを作成しています。
すでに backup がある場合でも、-p を付けているため扱いやすくなります。
base_name=$(basename “$target”)
対象の名前だけを取り出しています。
たとえば sample.txt なら、そのまま sample.txt が入ります。
cp -R “$target” “$destination”
指定した対象をバックアップ先へコピーしています。
-R を付けることで、ディレクトリを指定した場合もまとめてコピーできます。
初学者がつまずきやすい点
引数を渡し忘れる
sh backup_script.sh だけで実行すると、バックアップ対象が分かりません。
ファイル名またはディレクトリ名を必ず後ろに付けます。
ファイル名と保存先を混同する
target は元の対象です。
destination はコピー先です。
この2つを混同しないことが大切です。
cp -R の意味を理解する
今回は、ファイルにもディレクトリにも対応しやすいように -R を使っています。
そのため、ファイルだけでなくディレクトリを指定した場合もバックアップできます。
よくあるエラー
指定した対象が見つかりません
引数で指定した名前が正しいか確認してください。
現在のディレクトリにそのファイルやディレクトリがあるかも確認します。
バックアップ先が思った場所と違う
相対パスで backup を指定しているため、スクリプトをどこで実行したかが重要です。
必要なら pwd で現在地を確認してください。
上書きが心配になる
今回は日付付きの名前を使っているため、同じ日付で同じ対象を何度も実行しない限り、整理しやすい形になります。
より細かく区別したい場合は、時刻まで入れる方法もあります。
練習用コード
次の内容で backup_docs.sh を作成して実行してみてください。
#!/bin/sh
target="$1"
backup_dir="backup"
today=$(date +%Y%m%d)
if [ -z "$target" ]; then
echo "引数を指定してください"
exit 1
fi
if [ ! -e "$target" ]; then
echo "対象が見つかりません: $target"
exit 1
fi
mkdir -p "$backup_dir"
cp -R "$target" "$backup_dir/$(basename "$target")_$today"
echo "完了しました"
ファイルだけでなくディレクトリも指定して、動作の違いを確認してください。
この回で理解しておくこと
- 引数を受け取ると対象を切り替えられる
-eでファイルやディレクトリの存在確認ができるmkdir -pで保存先ディレクトリを用意できるdateの結果を使うと日付付きの名前を作れるcp -Rを使うとファイルもディレクトリもコピーしやすい- 小さな実用スクリプトは基本の組み合わせで作れる
まとめ
今回は、引数、条件分岐、コマンド置換、ファイル確認、コピー処理を組み合わせて、バックアップ用スクリプトを作りました。
この連載で学んだ基本を組み合わせるだけでも、実際に使える小さな自動化を作れることが分かります。
もう一度、はじめからゆっくりと
この回で、シェルスクリプト入門連載の全24回は終了です。
ここまで読み進めてきた今、もう一度最初の回に戻ってみてください。
必要に応じて、各回のコードを組み合わせながら自分用のスクリプトを少しずつ増やしていくと理解が深まります。
はじめは少し難しく感じた内容も、
きっと違った景色に見えてくるはずです。
シェルスクリプトは、一度で理解するものではなく、
何度か行き来しながら、少しずつ深まっていく言語です。
最初の一歩に戻ることは、後退ではありません。
それは、理解を確かなものにするための大切な一歩です。
👉 もう一度、第1回から読み直してみましょう。









