メインコンテンツへスキップ
中級12分で読める

シェルスクリプトの第一歩

Bashシェルスクリプトの基本を学び、日常的な作業を自動化する方法を実例を交えて詳しく解説します。

応用編シェルスクリプトbash自動化プログラミングスクリプト

🎯 この記事で学べること

  • 1
    シェルスクリプトとは何か、なぜ便利なのかを理解できます
  • 2
    変数、条件分岐、ループなど基本的な構文をマスターできます
  • 3
    関数を使った処理の再利用方法が身につきます
  • 4
    エラー処理とデバッグの基本的な方法を学べます
  • 5
    実践的な自動化スクリプトの作り方がわかります

読了時間: 約12

はじめに

こんにちは!今日は「シェルスクリプト」について学びましょう。

「毎日同じコマンドを何度も打つのが面倒...」「複雑な処理を自動化したい...」そんな経験はありませんか?

シェルスクリプトは、そんな悩みを解決してくれる魔法のような道具です。一度スクリプトを書いておけば、何度でも同じ処理を自動で実行できるんです!

シェルスクリプトって何?

シェルスクリプトは、普段ターミナルで打っているコマンドをファイルに書いて、まとめて実行できるようにしたものです。

例えるなら:

  • 普通のコマンド: 料理を一品ずつ作る
  • シェルスクリプト: レシピ通りに料理を自動で作る

プログラミングと聞くと難しそうですが、実はコマンドを順番に書くだけから始められるんです!

🎮 理解度チェック

シェルスクリプトの主な利点は何でしょう?

最初のシェルスクリプトを作ろう!

Hello World スクリプト

まずは定番の「Hello World」から始めましょう:

#!/bin/bash
# 最初のシェルスクリプト

echo "Hello, World!"
echo "現在の日時: $(date)"
echo "こんにちは、$USER さん!"

各行の意味:

  • #!/bin/bash - このファイルをBashで実行することを宣言(シェバン)
  • # - コメント(実行されない説明文)
  • echo - 文字を表示するコマンド
  • $(date) - dateコマンドの結果を埋め込む
  • $USER - 環境変数(現在のユーザー名)

スクリプトの実行方法

スクリプトを実行する方法は3つあります:

# 方法1: 実行権限を付けて実行(推奨)
$ chmod +x hello.sh
$ ./hello.sh

# 方法2: bashコマンドで実行
$ bash hello.sh

# 方法3: sourceで実行(現在のシェルで実行)
$ source hello.sh

通常は方法1がおすすめです。chmod +x で実行権限を付けることで、普通のコマンドのように使えるようになります!

変数を使ってみよう

変数の基本

変数は「値を入れる箱」のようなものです:

#!/bin/bash

# 変数を作る(=の前後にスペースを入れない!)
name="太郎"
age=25
city="東京"

# 変数を使う
echo "名前: $name"
echo "年齢: $age 歳"
echo "住所: $city"

# より安全な書き方({}で囲む)
echo "${name}さんは${city}に住んでいます"

特殊な変数

スクリプトには自動的に設定される特別な変数があります:

#!/bin/bash

echo "スクリプト名: $0"
echo "第1引数: $1"
echo "第2引数: $2"
echo "引数の個数: $#"
echo "すべての引数: $@"
echo "直前のコマンドの結果: $?"

実行例:

$ ./myscript.sh hello world
スクリプト名: ./myscript.sh
第1引数: hello
第2引数: world
引数の個数: 2
すべての引数: hello world
直前のコマンドの結果: 0

コマンドの結果を変数に入れる

#!/bin/bash

# $(コマンド) で結果を取得
current_date=$(date +%Y-%m-%d)
file_count=$(ls | wc -l)
current_dir=$(pwd)

echo "今日の日付: $current_date"
echo "ファイル数: $file_count"
echo "現在のディレクトリ: $current_dir"

条件分岐(if文)を使おう

基本的な if文

「もし〜なら、これをする」という処理を書けます:

#!/bin/bash

age=20

if [ $age -ge 18 ]; then
    echo "成人です"
else
    echo "未成年です"
fi

数値の比較

# 比較演算子
# -eq : 等しい (equal)
# -ne : 等しくない (not equal)
# -lt : より小さい (less than)
# -le : 以下 (less or equal)
# -gt : より大きい (greater than)
# -ge : 以上 (greater or equal)

score=85

if [ $score -ge 90 ]; then
    echo "秀"
elif [ $score -ge 80 ]; then
    echo "優"
elif [ $score -ge 70 ]; then
    echo "良"
elif [ $score -ge 60 ]; then
    echo "可"
else
    echo "不可"
fi

文字列の比較

#!/bin/bash

user="admin"

if [ "$user" = "admin" ]; then
    echo "管理者です"
else
    echo "一般ユーザーです"
fi

# 空文字列のチェック
name=""
if [ -z "$name" ]; then
    echo "名前が入力されていません"
fi

文字列を比較するときは、変数を " " で囲むことを忘れずに!空の変数でエラーになるのを防げます。

ファイルの存在チェック

#!/bin/bash

file="/etc/passwd"

if [ -f "$file" ]; then
    echo "$file は存在します"
fi

if [ -d "/home" ]; then
    echo "/home はディレクトリです"
fi

# よく使うファイルチェック
# -e : 存在する
# -f : 通常ファイル
# -d : ディレクトリ
# -r : 読み取り可能
# -w : 書き込み可能
# -x : 実行可能

🎮 理解度チェック

Bashで数値が10以上かを判定する正しい条件式は?

ループ処理を使おう

for ループ

同じ処理を繰り返したいときに使います:

#!/bin/bash

# リストを使ったループ
echo "好きな果物:"
for fruit in りんご バナナ オレンジ; do
    echo "  - $fruit"
done

# 数値の範囲でループ
echo "カウントダウン:"
for i in {5..1}; do
    echo "$i..."
    sleep 1
done
echo "スタート!"

# ファイルに対してループ
for file in *.txt; do
    echo "処理中: $file"
    # ファイルに対する処理
done

while ループ

条件が真の間、繰り返します:

#!/bin/bash

# カウンタを使った例
counter=1
while [ $counter -le 5 ]; do
    echo "ループ $counter 回目"
    counter=$((counter + 1))
done

# ファイルを1行ずつ読む
while IFS= read -r line; do
    echo "行: $line"
done < input.txt

関数を作ろう

処理をまとめて再利用できるようにします:

基本的な関数

#!/bin/bash

# 関数の定義
greet() {
    echo "こんにちは!"
    echo "今日もがんばりましょう!"
}

# 引数を受け取る関数
greet_user() {
    local name=$1  # local で関数内だけの変数に
    echo "こんにちは、${name}さん!"
}

# 関数を呼び出す
greet
greet_user "太郎"
greet_user "花子"

戻り値のある関数

#!/bin/bash

# ファイルの行数を数える関数
count_lines() {
    local file=$1
    if [ -f "$file" ]; then
        wc -l < "$file"
    else
        echo "ファイルが見つかりません" >&2
        return 1
    fi
}

# 使用例
lines=$(count_lines "data.txt")
if [ $? -eq 0 ]; then
    echo "行数: $lines"
fi

実践的なスクリプト例

簡単なバックアップスクリプト

#!/bin/bash

# 設定
SOURCE_DIR="$HOME/documents"
BACKUP_DIR="$HOME/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="backup_${DATE}.tar.gz"

# バックアップディレクトリを作成
mkdir -p "$BACKUP_DIR"

# バックアップ実行
echo "バックアップを開始します..."
tar -czf "${BACKUP_DIR}/${BACKUP_NAME}" "$SOURCE_DIR"

if [ $? -eq 0 ]; then
    echo "✓ バックアップ完了: $BACKUP_NAME"
else
    echo "✗ バックアップ失敗" >&2
    exit 1
fi

ファイル整理スクリプト

#!/bin/bash

# ダウンロードフォルダのファイルを種類別に整理

DOWNLOAD_DIR="$HOME/Downloads"
cd "$DOWNLOAD_DIR" || exit 1

# 整理先のディレクトリを作成
mkdir -p Images Documents Videos Others

# ファイルを種類別に移動
for file in *; do
    if [ -f "$file" ]; then
        case "${file,,}" in  # 小文字に変換して比較
            *.jpg|*.jpeg|*.png|*.gif)
                mv "$file" Images/
                echo "画像: $file → Images/"
                ;;
            *.pdf|*.doc|*.docx|*.txt)
                mv "$file" Documents/
                echo "文書: $file → Documents/"
                ;;
            *.mp4|*.avi|*.mov)
                mv "$file" Videos/
                echo "動画: $file → Videos/"
                ;;
            *)
                mv "$file" Others/
                echo "その他: $file → Others/"
                ;;
        esac
    fi
done

echo "整理が完了しました!"

🎮 理解度チェック

シェルスクリプトで関数内だけで使える変数を宣言するキーワードは?

エラー処理とデバッグ

エラーに強いスクリプトを書く

#!/bin/bash

# エラーが起きたら即座に終了
set -e

# 未定義の変数を使ったらエラー
set -u

# エラーメッセージを表示する関数
error_exit() {
    echo "エラー: $1" >&2
    exit 1
}

# ファイルの存在チェック
file="/path/to/important/file"
[ -f "$file" ] || error_exit "ファイルが見つかりません: $file"

echo "処理を続行します..."

デバッグ方法

#!/bin/bash

# デバッグモードをON(実行されるコマンドを表示)
set -x

echo "これが表示されます"
name="太郎"
echo "名前は $name です"

# デバッグモードをOFF
set +x

echo "通常の出力"

スクリプトを書くときのコツ

1. わかりやすい変数名を使う

# 悪い例
a=10
b=20

# 良い例
width=10
height=20

2. コメントを書く

#!/bin/bash
# ファイルバックアップスクリプト
# 作成日: 2025-01-08
# 用途: 重要なファイルを定期的にバックアップ

# 設定値
BACKUP_DIR="/backup"  # バックアップ先

3. エラーチェックを忘れない

# ディレクトリ移動時は必ずチェック
cd "$target_dir" || {
    echo "ディレクトリに移動できません: $target_dir"
    exit 1
}

4. 変数は引用符で囲む

# スペースを含むファイル名でも安全
file="my document.txt"
cat "$file"  # 引用符で囲む

最初は簡単なスクリプトから始めて、徐々に機能を追加していきましょう。動くものを作ってから改良する方が楽しく学べます!

📝 まとめ

今日はシェルスクリプトの基本を学びました!

  • シェルスクリプトはコマンドをファイルにまとめたもの
  • 変数、条件分岐、ループで柔軟な処理が書ける
  • 関数を使って処理を再利用できる
  • エラー処理を適切に行うことが大切
  • 日常の繰り返し作業を自動化できる

シェルスクリプトを使えば、面倒な作業から解放されて、もっと創造的なことに時間を使えるようになります。まずは簡単な自動化から始めてみましょう!

次はcronコマンドで、作ったスクリプトを定期的に自動実行する方法を学んでみませんか?

今日の練習: まず、自分の名前を表示する簡単なスクリプトを作ってみましょう。次に、複数のファイルの拡張子を一括で変更するスクリプトに挑戦してみてください!