HapInS Developers Blog

HapInSが提供するエンジニアリングの情報サイト

【解説】Bashでキー入力を受け付けて応答するインタラクティブなスクリプトの作り方

こんにちは。最近八角形の卓球ラケットを手に入れました🏓ponです。

はじめに

Bashスクリプトは、システム処理の自動化だけでなく、ユーザーとの対話を通じて、魅力的なプログラムを作成するための強力なツールです。

この記事では、Bashスクリプトを使用してキーボードからの入力を読み取り、対話的な応答を行う方法を詳しく解説します。 もしもあなたがプログラミングの世界に少しずつ足を踏み入れているのであれば、この記事はあなたの興味を引くこと間違いなしです。

スクリプトが動き出す背景

ある日、システムの設定を変更したり、データを処理したりするシンプルなプログラムを作成する必要が生じました。 あなたはそれまでの経験から、単にコマンドを羅列するだけではユーザー体験に欠けると感じました。そこで、シンプルながらもユーザーとの対話を取り入れることで、プログラムをもっと魅力的にしようと考えました。

readコマンドって何?どんなことができるの?

さて、その実現のために登場するのが「readコマンド」です。このコマンドを使うことで、あなたのプログラムはユーザーの入力を待ち、その入力を変数に格納することができます。例えば、プログラムを実行するユーザーに名前を尋ね、その名前を使ってカスタマイズされたメッセージを表示することができます。

それでは、実際に試してみましょう。 以下は、readコマンドを使用してユーザーとの対話を取り入れたスクリプトの例です。 プログラミングの初心者でも理解しやすいよう、順を追って解説します。

#!/bin/bash

echo "What is your name?"
read name
echo "Hello, $name! Nice to meet you."

このスクリプトでは、ユーザーに名前を尋ね、readコマンドを使用してキーボードからの入力を読み取ります。 入力された名前は、$name 変数に格納され、後続の応答文で使用されます。

プロンプトの表示と条件分岐を使用した応答の制御

以下のスクリプトでは、ユーザーにプログラミングの好き嫌いを尋ね、条件分岐を使用して応答に基づいたメッセージを表示します。 ユーザーの入力が「yes」または「no」でない場合は、無効な応答としてエラーメッセージを表示します。

#!/bin/bash

echo "Do you like programming? (yes/no)"
read response

if [ "$response" = "yes" ]; then
    echo "That's great! Programming is fun."
elif [ "$response" = "no" ]; then
    echo "That's okay. Programming is not for everyone."
else
    echo "Invalid response. Please enter either 'yes' or 'no'."
fi

パスワードの隠し文字入力

次のスクリプトでは、ユーザーにパスワードの入力を求めますが、入力された文字は表示されません(-s オプションにより隠されます)。 パスワードは $password 変数に格納され、後続の処理で使用することができます。

#!/bin/bash

echo "Enter your password:"
read -s password
echo "Password accepted."

注意点

read コマンドは、デフォルトで改行文字までの入力を読み取ります。 改行文字を読み取らずに指定の文字数だけ読み込む場合は、 -n オプションを使用します。 また、ユーザーが特定のキー(例: Ctrl + C)を押すとスクリプトが中断される可能性があるため、適切なエラーハンドリングを行うことが重要です。

上記に挙げた2つの注意点について、スクリプトの例を記述します。

改行文字を読み取らずに指定の文字数だけ読み込む場合の例

#!/bin/bash

# ユーザーからの入力を指定の文字数だけ読み取る関数
get_input() {
  read -n 5 -p "5文字までの入力をしてください: " input
  echo "入力した文字列は '$input' です。"
}

# メインのスクリプト
echo "このスクリプトは5文字までの入力を読み取るプログラムです。"

get_input

このスクリプトでは、readコマンドに-nオプションを使用して、5文字までの入力を読み取るように指定しています。 -pオプションを使用してプロンプトを表示し、ユーザーからの入力を待ちます。入力された文字列はinput変数に格納され、それを表示します。

例えば、ユーザーが"Hello, World!"と入力した場合、スクリプト"Hello"という部分だけを読み取ります。 改行文字以降の文字は読み取られません。

注意点として、指定した文字数までの入力がない場合、改行文字が読み取られるまで待機します。 つまり、指定した文字数に達しない入力が行われた場合でも、Enterキーを押すまで待機することになります。

以上はあくまで一例ですので、必要に応じてオプションの値や処理内容を変更してください。

ユーザーがスクリプトを中断する場合を考慮したエラーハンドリングの例

以下は、readコマンドを使用してインタラクティブスクリプトを作成する際に、Ctrl+Cを押した場合のエラーハンドリングを考慮したスクリプトの例です。

#!/bin/bash

# Ctrl+Cでスクリプトを中断した場合の処理を設定
trap "echo 'スクリプトが中断されました。'; exit" SIGINT

# ユーザーからの入力を読み取る関数
get_input() {
  read -p "好きな数字を入力してください: " number
  echo "入力した数字は $number です。"
}

# メインのスクリプト
echo "このスクリプトは好きな数字を入力するプログラムです。"
echo "Ctrl+Cを押してスクリプトを中断することができます。"

while true; do
  get_input
done

このスクリプトでは、trapコマンドを使用して、Ctrl+Cが押されたときに実行する処理を指定しています。 trap "echo 'スクリプトが中断されました。'; exit" SIGINTという行が、Ctrl+Cが押されたときに表示するメッセージを定義し、スクリプトを終了させる処理を行います。

メインのスクリプトでは、get_input関数を呼び出してユーザーからの入力を受け取り、入力した数字を表示します。

無限ループを使用しているため、ユーザーがCtrl+Cを押してもスクリプトは終了せず、繰り返し入力を受け付けます。 Ctrl+Cが押された場合、設定したエラーハンドリングが実行されます。

こちらもあくまで一例ですので、適宜修正や追加のエラーハンドリングを行うことを推奨いたします。

まとめ

Bashスクリプトを使用すると、キーボードからの入力を受け取り、ユーザーと対話することができます。

この記事では、基本的なキー入力の受け取り方から条件分岐と応答の制御、パスワードの隠し文字入力までを解説しました。 Bashスクリプトの力を活用して、よりインタラクティブなユーザー体験を提供するスクリプトを作成してみてください。