Linuxを使い始めて、コマンドには少し慣れてきたけれど、シェルスクリプトとなると別の話に感じる方も多いと思います。
でも実は、シェルスクリプトは「コマンドをファイルに書いて実行するだけ」という、ごくシンプルなものです。
プログラミングの知識がなくても、Linuxのコマンドを少し知っていれば、すぐに動かすことができます。
この記事では、シェルスクリプトを一度も書いたことがない初心者の方向けに、作成から実行までの基本手順と、覚えておくだけで便利になる基礎構文・エラー対処法を丁寧に解説します。
この記事のポイント
・シェルスクリプトは「コマンドを並べたファイル」で動かすだけでOK
・chmod +x で実行権限を付与し ./スクリプト名.sh で動かせる
・変数・if・for の3つを押さえれば自動化の基礎は完成する
・bash -n スクリプト名.sh で実行前に構文チェックをするとトラブルが防げる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
シェルスクリプトとは何か?コマンドをまとめて自動化するファイル
普段ターミナルに入力しているコマンド、たとえばls や cp は、1行ずつ手動で打ち込んでいます。シェルスクリプトとは、こうしたコマンドをファイルに書いておいて、まとめて実行できるようにしたものです。
たとえば、以下のような作業をスクリプト化すると大きな効果があります。
・毎朝同じフォルダをバックアップしたい
・ログファイルを定期的に整理したい
・複数のサービスの起動確認を一度にやりたい
・毎週同じコマンド操作を繰り返している
こういった繰り返し作業をシェルスクリプトにまとめ、cronと組み合わせて自動実行することで、手作業によるミスや「やり忘れ」を防ぐことができます。
Windowsのバッチファイル(.bat)に相当するもの、と考えると近いです。ただしLinuxのシェルスクリプトは機能がはるかに豊富で、実務の自動化の多くがシェルスクリプトで実装されています。
最初のシェルスクリプトを作って動かす
1. ファイルを作成する
まずテキストエディタでシェルスクリプトファイルを作成します。ここではnano を使います。# nanoでファイルを新規作成 nano hello.sh
#!/bin/bash echo "こんにちは、Linuxの世界へようこそ!" echo "今日の日付: $(date)"
#!/bin/bash(シバン行と呼びます)は「このスクリプトをbashで実行してください」という宣言です。これがないと、どのシェルで動かすかが曖昧になるため、必ず最初の行に書く習慣をつけましょう。
nanoを保存して閉じるには
Ctrl+O(保存)→ Enter → Ctrl+X(終了)の順に操作します。2. 実行権限を付与する
作成したファイルをそのまま実行しようとしても、デフォルトでは「実行権限」がないため動きません。以下のコマンドで実行権限を付与します。
# 実行権限を付与 chmod +x hello.sh # 権限を確認(-rwxrwxr-x のように x が付いていればOK) ls -l hello.sh
-rwxrwxr-x 1 tomohiro tomohiro 72 Apr 28 10:00 hello.sh
3. スクリプトを実行する
./ に続けてファイル名を入力して実行します。./hello.sh
こんにちは、Linuxの世界へようこそ! 今日の日付: Mon Apr 28 10:00:15 JST 2026
$(date) の部分は、実行した瞬間の日付・時刻に自動で置き換わります。これを「コマンド置換」と呼びます。長いスクリプトを書いた場合は、実行前に
bash -n hello.sh で構文チェックをするとエラーの原因を事前に確認できます。詳しくは後述のTipsセクションで解説します。シェルスクリプトの基本構文3つ
シェルスクリプトを使いこなすうえで、最低限知っておきたい構文が3つあります。1. 変数:繰り返し使う値を名前で管理する
変数は「名前=値」の形式で定義します。使うときは変数名の前に$ を付けます。#!/bin/bash # 変数を定義 USERNAME="taro" BACKUP_DIR="/home/${USERNAME}/backup" echo "ユーザー名: ${USERNAME}" echo "バックアップ先: ${BACKUP_DIR}"
ユーザー名: taro バックアップ先: /home/taro/backup
${変数名} と書くと、文字列の中に変数を埋め込むときに見やすくなります。また、変数の定義でイコールの前後にスペースを入れると変数が設定されない点に注意してください(「よくあるエラー」で詳述します)。
2. if文:条件によって処理を変える
「ファイルが存在する場合だけ処理する」「ディレクトリがなければ作成する」といった条件分岐は、if文で実現します。#!/bin/bash TARGET_DIR="/home/tomohiro/backup" # ディレクトリが存在しない場合は作成する if [ ! -d "${TARGET_DIR}" ]; then echo "${TARGET_DIR} が存在しないため作成します" mkdir -p "${TARGET_DIR}" echo "作成完了" else echo "${TARGET_DIR} はすでに存在します" fi
・!(感嘆符):条件を否定する。「存在しない場合」という意味になる
・fi:if文の終わりを示す(ifを逆から読むとfi)
3. for文:同じ処理を繰り返す
複数のファイルに同じ処理を行いたいときに使います。「リストの要素を1つずつ取り出して処理する」という考え方で、慣れると非常に便利です。
#!/bin/bash # /var/log 内の .log ファイルをひとつずつ確認する for logfile in /var/log/*.log; do echo "ファイル: ${logfile}" echo "サイズ: $(du -sh ${logfile} | cut -f1)" done
ファイル: /var/log/apt/history.log サイズ: 8.0K ファイル: /var/log/auth.log サイズ: 12K ファイル: /var/log/syslog サイズ: 48K
実践:ファイルをバックアップするスクリプトを作る
変数・if・forを組み合わせて、実際に使えるバックアップスクリプトを作ってみましょう。ここでは、ディレクトリを日付付きの tar.gz(圧縮アーカイブ)で保存し、7日以上古いバックアップは自動削除する、実務に近い構成にします。
#!/bin/bash set -e # ---- 設定 ---- SOURCE_DIR="/home/tomohiro/documents" BACKUP_BASE="/home/tomohiro/backup" DATE=$(date +%Y%m%d) ARCHIVE="${BACKUP_BASE}/documents-${DATE}.tar.gz" LOG="${BACKUP_BASE}/backup.log" # ---- バックアップ先ディレクトリの作成 ---- if [ ! -d "${BACKUP_BASE}" ]; then mkdir -p "${BACKUP_BASE}" echo "バックアップ先を作成しました: ${BACKUP_BASE}" fi # ---- 圧縮アーカイブを作成 ---- echo "[$(date '+%Y-%m-%d %H:%M:%S')] バックアップ開始" >> "${LOG}" tar -czf "${ARCHIVE}" "${SOURCE_DIR}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] ${ARCHIVE} を作成しました" >> "${LOG}" # ---- 7日以上古いバックアップを削除 ---- find "${BACKUP_BASE}" -name "documents-*.tar.gz" -mtime +7 -delete echo "[$(date '+%Y-%m-%d %H:%M:%S')] 古いバックアップを削除しました" >> "${LOG}" echo "バックアップが完了しました: ${ARCHIVE}"
・
/home/tomohiro/documents/ を documents-20260428.tar.gz の形で圧縮保存する・ログファイルに実行時刻と処理内容を記録する
・7日以上前のバックアップファイルを自動削除し、ディスク容量を節約する
cronに登録して毎日深夜に自動実行することで、バックアップを完全に自動化できます。
トラブルシュート:よくあるエラーと対処法
「Permission denied」と表示される
実行権限がない状態で実行しようとしたときのエラーです。# エラー例 -bash: ./hello.sh: Permission denied # 対処: 実行権限を付与する chmod +x hello.sh
「/bin/bash^M: bad interpreter」と表示される
Windowsのテキストエディタ(メモ帳等)でファイルを編集したときに発生します。Windowsは行末に「^M(CR)」という文字を付ける仕様があり、Linux側でエラーになります。
# dos2unix コマンドで変換する(インストールが必要な場合あり) dos2unix hello.sh # または sed で CR を削除する sed -i 's/\r//' hello.sh
変数が空になってしまう
変数の定義でイコールの前後にスペースを入れると、変数が設定されません。# NG: = の前後にスペースがある USERNAME = "taro" # OK: = の前後にスペースなし USERNAME="taro"
「No such file or directory」と表示される
スクリプト内で指定しているパスが存在しない場合に出るエラーです。バックアップ先や保存先ディレクトリを作成し忘れていることが多いです。
# ディレクトリの存在確認 ls -la /home/tomohiro/backup/ # 存在しない場合は作成(-p で中間ディレクトリも一括作成) mkdir -p /home/tomohiro/backup/
cronで実行すると動かない
cronの実行環境は通常のログインシェルとは異なり、PATH(コマンドの検索パス)が限定されています。スクリプト冒頭に PATH を明示することで解決できます。
#!/bin/bash # cron環境でもコマンドを正しく見つけるためにPATHを明示する PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
シェルスクリプトをより便利にするTips
bash -n で構文エラーを実行前にチェックする
スクリプトを実行する前にbash -n スクリプト名.sh を使うと、実際には実行せずに構文チェックだけを行えます。長いスクリプトで「動かしてからエラーに気づく」という手戻りを防ぐために、実行前の習慣にしましょう。
# 構文チェック(実際には実行されない) bash -n backup.sh # エラーがなければ何も表示されない(= 構文OK) # 構文エラーがある場合はエラーメッセージが表示される
set -e でエラー時に自動停止させる
スクリプトの2行目にset -e を書いておくと、コマンドがエラーになった時点でスクリプトが停止します。処理の途中でエラーが起きても気づかないまま次の処理に進んでしまう事故を防げます。
#!/bin/bash set -e # このコマンドがエラーになったら、以降の処理は実行されない cp /存在しないファイル /tmp/ echo "この行は実行されない"
echo でデバッグ情報を表示する
スクリプトが期待通りに動かないときは、変数の中身をecho で確認するのが基本です。# 変数の中身を確認 echo "SOURCE_DIR = ${SOURCE_DIR}" echo "BACKUP_DIR = ${BACKUP_DIR}"
コメントで意図を残す
# で始まる行はコメントとして無視されます。数週間後の自分が読んでも意図がわかるよう、コメントを書く習慣をつけましょう。#!/bin/bash # スクリプト名: backup.sh # 用途: documentsディレクトリを日付別フォルダにバックアップする # 作成日: 2026-04-28 # 実行方法: ./backup.sh
本記事のまとめ
シェルスクリプトの基本をまとめます。| やりたいこと | 方法・コマンド |
|---|---|
| スクリプトファイルを作成する | nano スクリプト名.sh |
| シバン行を書く | #!/bin/bash(必ず1行目) |
| 実行権限を付与する | chmod +x スクリプト名.sh |
| 実行前に構文チェックする | bash -n スクリプト名.sh |
| スクリプトを実行する | ./スクリプト名.sh |
| 変数を定義する | 変数名="値"(= の前後にスペースなし) |
| 変数を使う | ${変数名} |
| 条件分岐する | if [ 条件 ]; then ... fi |
| 繰り返し処理する | for 変数 in リスト; do ... done |
| エラー時に自動停止する | set -e(2行目に書く) |
| cron環境でPATHを設定する | スクリプト冒頭に PATH=/usr/local/sbin:... を明示 |
まずは自分のよく使うコマンドをファイルにまとめて実行してみるところから始めましょう。
無料の「Linuxサーバー構築入門マニュアル(図解60ページ)」をプレゼントしています。
シェルスクリプトをはじめとしたLinuxの実務スキルを体系的に学びたい方は、ぜひ受け取ってみてください。
無料マニュアルを受け取る >>
次に学ぶなら:Linuxスキルアップ記事のご案内
シェルスクリプトの基礎をつかんだら、次はLinuxの各スキルをさらに深めていきましょう。以下の記事が参考になります。
・Linuxコマンドの基礎:ターミナル操作の土台をしっかり固める
・ファイル操作コマンド:cp・mv・rmを使いこなして作業効率を上げる
・ユーザー管理:rootと一般ユーザーの使い分けを理解する
・パーミッション設定:chmodで読み書き実行の権限を管理する
・プロセス管理:バックグラウンド処理とpsコマンドをマスターする
・ネットワーク確認コマンド:ipコマンドとpingで接続状態を確認する
・シェルスクリプト入門:本記事の続きとして、応用的な自動化スクリプトを学ぶ
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:Linuxのファイル検索入門|findコマンドで目的のファイルを素早く見つける方法
- 前のページへ:Linuxのログファイル入門|tailとlessでサーバーの状態を読む方法
- この記事の属するカテゴリ:【Linux入門】初心者のための基礎知識・講座へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます