このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプト:クイズゲーム

シェルスクリプト:クイズゲーム

 シェルスクリプトは、システム管理やタスクの自動化だけでなく、簡単なゲームやツールを作成する際にも非常に便利です。ここでは、シェルスクリプトを使って「クイズゲーム」を作成し、その作成から実行までの手順と詳細な解説を行います。この演習を通して、シェルスクリプトの基本的な構文や制御構造、配列の扱い方などを学ぶことができます。

クイズゲームの概要

  • 目的:ユーザーに対して複数の質問を出題し、正解数をカウントします。
  • ルール
    ・クイズは選択式で、各質問に対して3つの選択肢があります。
    ・ユーザーは選択肢の中から正しい答えを選びます。
    ・全ての質問に回答後、正解数を表示します。

スクリプトの内容解説

実際のスクリプト quiz_game.sh を見ながら、各部分の解説を行います。

スクリプト全体

#!/bin/bash

# クイズの問題と回答を配列で定義
questions=(
    "Linuxの開発者は誰ですか?"
    "次のうち、パッケージ管理システムでないものはどれですか?"
    "シェルスクリプトでコメントを表す記号はどれですか?"
)

options=(
    "1) リーナス・トーバルズ\n2) ビル・ゲイツ\n3) スティーブ・ジョブズ"
    "1) apt\n2) yum\n3) git"
    "1) #\n2) $\n3) &"
)

answers=(1 3 1)  # 正解の選択肢番号

score=0  # 正解数の初期化

echo "クイズゲームへようこそ!全ての質問に答えてください。"

# クイズのループ
for i in ${!questions[@]}; do
    echo
    echo "問題 $((i+1)): ${questions[$i]}"
    echo -e "${options[$i]}"
    read -p "あなたの答えを番号で入力してください: " user_answer

    # 入力のバリデーション
    if ! [[ "$user_answer" =~ ^[1-3]$ ]]; then
        echo "エラー: 1から3の数字を入力してください。"
        continue  # 次の問題へ
    fi

    if [ "$user_answer" -eq "${answers[$i]}" ]; then
        echo "正解です!"
        score=$((score + 1))
    else
        echo "不正解です。"
    fi
done

echo
echo "クイズが終了しました。あなたの正解数は ${score} / ${#questions[@]} です。"

スクリプトの各部分の解説

実際のスクリプト quiz_game.sh を見ながら、各部分の解説を行います。

1.シェバン

#!/bin/bash
  • スクリプトが /bin/bash シェルで実行されることを指定します。

2.クイズの問題と回答の定義

questions=(
    "Linuxの開発者は誰ですか?"
    "次のうち、パッケージ管理システムでないものはどれですか?"
    "シェルスクリプトでコメントを表す記号はどれですか?"
)

options=(
    "1) リーナス・トーバルズ\n2) ビル・ゲイツ\n3) スティーブ・ジョブズ"
    "1) apt\n2) yum\n3) git"
    "1) #\n2) $\n3) &"
)

answers=(1 3 1)  # 正解の選択肢番号
  • questions:問題文を格納する配列です。
  • options:各問題の選択肢を格納する配列です。\n を使って改行を表現しています。
  • answers:各問題の正解となる選択肢の番号を格納する配列です。

3.スコアの初期化

score=0  # 正解数の初期化
  • ユーザーの正解数をカウントする変数を初期化します。

4.ゲーム開始のメッセージ

echo "クイズゲームへようこそ!全ての質問に答えてください。"
  • ゲームの開始をユーザーに知らせます。

5.クイズのループ

for i in ${!questions[@]}; do
    # 質問と選択肢の表示
    # ユーザーからの入力受付
    # 入力のバリデーション
    # 答えの判定
done
  • ${!questions[@]}questions 配列の全インデックスを取得します。
  • for ループを使って、各質問を順番に処理します。

6.質問と選択肢の表示

echo
echo "問題 $((i+1)): ${questions[$i]}"
echo -e "${options[$i]}"
  • echo コマンドで空行を挿入します。
  • 現在の問題番号と質問文を表示します。
  • echo -e を使って、\n を改行として解釈し、選択肢を表示します。

7.ユーザーからの入力受付

read -p "あなたの答えを番号で入力してください: " user_answer
  • read コマンドでユーザーの入力を受け取ります。

8.入力のバリデーション

if ! [[ "$user_answer" =~ ^[1-3]$ ]]; then
    echo "エラー: 1から3の数字を入力してください。"
    continue  # 次の問題へ
fi
  • [[ "$user_answer" =~ ^[1-3]$ ]] で入力が1から3の数字かどうかを正規表現でチェックします。
  • 不正な入力の場合、エラーメッセージを表示し、continue で次の問題へ進みます。

9.答えの判定

if [ "$user_answer" -eq "${answers[$i]}" ]; then
    echo "正解です!"
    score=$((score + 1))
else
    echo "不正解です。"
fi
  • ユーザーの回答と正解の選択肢番号を比較します。
  • 正解の場合、スコアを1増やします。

10.結果の表示

echo
echo "クイズが終了しました。あなたの正解数は ${score} / ${#questions[@]} です。"
  • 全ての問題が終了した後、ユーザーの正解数と全問題数を表示します。

スクリプトの作成と実行手順

ステップ1:スクリプトファイルの作成

ターミナルで以下のコマンドを実行し、新しいスクリプトファイル quiz_game.sh を作成します。

user01@ubuntu:~$ nano quiz_game.sh

ステップ2:スクリプトの内容を記述

エディタが開いたら、先ほどのスクリプトの内容をコピーして貼り付けます。

ステップ3:スクリプトに実行権限を付与

スクリプトを保存してエディタを終了したら、実行権限を付与します。

user01@ubuntu:~$ chmod +x quiz_game.sh

ステップ4:スクリプトの実行

スクリプトを実行して、クイズゲームを開始します。

user01@ubuntu:~$ ./quiz_game.sh

実行例

クイズゲームへようこそ!全ての質問に答えてください。

問題 1: Linuxの開発者は誰ですか?
1) リーナス・トーバルズ
2) ビル・ゲイツ
3) スティーブ・ジョブズ
あなたの答えを番号で入力してください: 1
正解です!

問題 2: 次のうち、パッケージ管理システムでないものはどれですか?
1) apt
2) yum
3) git
あなたの答えを番号で入力してください: 3
正解です!

問題 3: シェルスクリプトでコメントを表す記号はどれですか?
1) #
2) $
3) &
あなたの答えを番号で入力してください: 2
不正解です。

クイズが終了しました。あなたの正解数は 2 / 3 です。

ステップ5:ここで作成したファイルの削除

演習が終了したら、作成した quiz_game.sh ファイルを削除します。

user01@ubuntu:~$ rm quiz_game.sh

まとめ

  • シェルスクリプトの活用:シェルスクリプトを使って、簡単なクイズゲームを作成しました。これにより、シェルスクリプトの基本的な構文や制御構造を学ぶことができます。
  • 配列の利用:質問文や選択肢、正解を配列で管理することで、複数のデータを効率的に扱う方法を学びました。
  • 入力のバリデーション:ユーザーからの入力を正規表現でチェックし、不正な入力に対して適切な対応を行う方法を学びました。
  • 条件分岐とループif 文や for ループを使って、条件に応じた処理や繰り返し処理を実装しました。
  • スクリプトの実行:シェルスクリプトの作成から実行までの基本的な手順を確認しました。

 シェルスクリプトは、日常のタスクを自動化したり、簡単なツールやゲームを作成するのに非常に便利です。今回のクイズゲームを基に、さらに問題を追加したり、難易度を調整したりすることで、シェルスクリプトの理解を深めることができます。ぜひ、さまざまなアイデアを取り入れて、自分だけのシェルスクリプトを作成してみてください。