本記事では、bashでキー入力を受け取る方法を解説します。readコマンドを使うことで、簡単にキー入力を扱うことができるため、このコマンドについて説明します。
readとは
readコマンドは、標準入力からテキストを読み取り、変数に格納するための基本的なbashコマンドです。ユーザーのキー入力を受け取るシェルスクリプトを作成する際に非常に重要なコマンドとなります。スクリプトの対話性を高め、ユーザーからの入力に基づいて処理を分岐させるなど、柔軟な処理が可能になります。
構文
readコマンドの基本的な構文は以下の通りです。
read [オプション] [変数名...]
変数名を指定すると、入力された値がその変数に格納されます。変数名を省略した場合は、デフォルトの変数REPLYに値が格納されます。
#!/bin/bash
echo "何か入力してください:"
read
echo "あなたの入力: $REPLY"
例
基本的な使い方
以下の例では、ユーザーに名前の入力を促し、入力された名前を表示します。readコマンドで受け取った入力はnameという変数に格納されます。
#!/bin/bash
echo "あなたの名前を入力してください:"
read name
echo "こんにちは、${name}さん!"
複数の入力値を受け取る
この例では、スペースで区切られた複数の入力(姓と名)をそれぞれ別の変数に格納しています。
#!/bin/bash
echo "あなたの姓と名を入力してください:"
read first_name last_name
echo "こんにちは、${first_name} ${last_name}さん!"
主なオプション
readコマンドには様々なオプションがあります。ここでは主要なものを紹介します。
table形式で表示
オプション | 説明 |
---|---|
-p “プロンプト” | 入力前にプロンプトメッセージを表示する |
-s | 入力をエコーバックしない(パスワード入力などに使用) |
-n N | 最大N文字だけ読み込む |
-t N | N秒でタイムアウトする |
-r | バックスラッシュをエスケープ文字として扱わない |
-a array | 入力を配列変数に格納する |
-d delim | 指定した区切り文字までを読み込む |
各オプションの使用例
p オプション(プロンプト表示)
pオプションを使うと入力を促すメッセージを簡潔に表示できます。ユーザーは同じ行に入力することになります。
#!/bin/bash
read -p "ユーザー名を入力してください: " username
echo "入力されたユーザー名: ${username}"
s オプション(入力を表示しない)
sオプションはパスワードなど、画面に表示したくない情報の入力に使用します。入力中の文字が画面に表示されません。
#!/bin/bash
read -sp "パスワードを入力してください: " password
echo
echo "パスワードが入力されました"
n オプション(文字数制限)
nオプションで指定した文字数だけ入力を受け付けます。この例では1文字だけ読み込むので、Enterキーを押さなくても次の処理に進みます。
#!/bin/bash
read -n 1 -p "続けるには何かキーを押してください..." key
echo
echo "キー ${key} が押されました"
t オプション(タイムアウト)
tオプションで入力のタイムアウト時間を秒単位で指定できます。指定時間内に入力がなければ、処理が続行されます。
#!/bin/bash
read -t 5 -p "5秒以内に入力してください: " input
if [ -z "$input" ]; then
echo "タイムアウトしました"
else
echo "入力: ${input}"
fi
r オプション(エスケープ文字を無効化)
rオプションを使うと、バックスラッシュ(\)をエスケープ文字として扱わず、そのまま入力として受け取ります。
#!/bin/bash
echo "バックスラッシュを含む文字列を入力してください:"
read -r input
echo "入力された文字列: ${input}"
a オプション(配列として読み込む)
aオプションを使うと、スペースで区切られた複数の入力を配列として格納できます。
#!/bin/bash
echo "スペース区切りで複数の値を入力してください:"
read -a values
echo "最初の値: ${values[0]}"
echo "2番目の値: ${values[1]}"
echo "すべての値: ${values[@]}"
d オプション(区切り文字を指定)
dオプションを使うと、指定した文字が入力されるまでをひとつの入力として受け取ります。デフォルトは改行(Enter)です。
#!/bin/bash
echo "コロン(:)が入力されるまで読み込みます:"
read -d ":" input
echo "入力: ${input}"
注意点
- セキュリティの考慮: 特にパスワードやセンシティブな情報を扱う場合は、-sオプションを使用して入力を画面に表示しないようにしましょう。
- タイムアウトの活用: ユーザー入力を待つスクリプトがずっと待機状態になることを防ぐために、-tオプションでタイムアウトを設定することが推奨されます。
- エラー処理: ユーザーが何も入力せずにEnterキーを押した場合など、エラー処理を適切に行いましょう。
以下の例では、ユーザーが名前を入力しない場合のエラー処理を実装しています。
#!/bin/bash
read -p "名前を入力してください: " name
if [ -z "$name" ]; then
echo "名前が入力されていません"
exit 1
fi
echo "こんにちは、${name}さん!"
応用例
メニュー選択の実装
このスクリプトは、メニューを表示して1つのキー入力で選択を受け付ける例です。case文と組み合わせることで、選択に応じた処理を実行します。
#!/bin/bash
echo "操作を選択してください:"
echo "1) ファイルの一覧表示"
echo "2) 現在のディレクトリを表示"
echo "3) 日時を表示"
read -n 1 -p "選択 (1-3): " choice
echo
case $choice in
1) ls -la ;;
2) pwd ;;
3) date ;;
*) echo "無効な選択です" ;;
esac
Yes/No確認
ユーザーにYes/Noで確認を取るシンプルなパターンです。最初の1文字だけを取り出して判定しています。
#!/bin/bash
read -p "処理を続行しますか? (y/n): " answer
case ${answer:0:1} in
y|Y) echo "処理を続行します" ;;
*) echo "処理を中止しました"; exit 1 ;;
esac
パスワード検証
パスワードを2回入力させて一致するか確認する例です。セキュリティのため-sオプションでパスワードを画面に表示しないようにしています。
#!/bin/bash
read -sp "パスワードを入力: " pass1
echo
read -sp "パスワードを再入力: " pass2
echo
if [ "$pass1" = "$pass2" ]; then
echo "パスワードが一致しました"
else
echo "パスワードが一致しません"
fi
まとめ
readコマンドは、Bashスクリプトでユーザー入力を受け取るための強力なツールです。様々なオプションを活用することで、単純な入力から複雑な対話的スクリプトまで、幅広いニーズに対応することができます。
- 基本的な構文は簡単で覚えやすい
- 多彩なオプションで柔軟な入力制御が可能
- セキュリティを考慮した入力も実装できる
- シェルスクリプトに対話性を持たせる基本的なコマンド
適切なオプションを使い分けることで、ユーザーフレンドリーなスクリプトを作成することができます。