Linuxでシェルスクリプトを書くとき、ユーザーからの入力を受け取る方法としてよく使われるのが「read
コマンド」です。たとえば「名前を入力してください」とメッセージを出して、ユーザーが入力した内容を変数に格納する──そんな処理は、read
を使えば簡単に実現できます。
この記事では、read
コマンドの基本的な使い方から、複数の入力を扱う方法、タイムアウトを設定する方法、さらには応用的な使い方まで、わかりやすく解説していきます。スクリプトにインタラクティブな要素を取り入れたいと考えている方には必見の内容です。
readコマンドとは?
Linuxのread
コマンドは、ユーザーがキーボードから入力した文字列を読み取り、指定した変数に格納するためのコマンドです。シェルスクリプトにおいて、対話型の処理を実装する際に欠かせない存在です。
基本構文は以下の通りです:
read [オプション] 変数名
ユーザーが何かを入力して Enter キーを押すと、その値が変数に代入されます。
基本的な使い方
たとえば、ユーザーに名前を入力してもらい、それを表示する簡単なスクリプトは以下のようになります。
#!/bin/bash
echo "あなたの名前を入力してください:"
read name
echo "こんにちは、$name さん!"
このスクリプトを実行すると、「あなたの名前を入力してください:」と表示され、ユーザーが入力した内容が変数 name
に格納されます。
入力プロンプトを表示する方法(-pオプション)
read
コマンドでは、-p
オプションを使うことで、echo
コマンドを使わずにプロンプトを表示できます。
read -p "好きな食べ物は?:" food
echo "あなたの好きな食べ物は $food ですね。"
この方法を使えば、よりスマートなスクリプトになります。
入力に制限時間を設ける(-tオプション)
入力を待つ時間に制限をつけたい場合は、-t
オプションを使います。
read -t 5 -p "5秒以内に名前を入力してください:" name
この場合、5秒以内に入力がなければスクリプトはそのまま次の処理に進みます。入力が間に合わなかった場合、変数には値が入りません。
入力時に表示を隠す(パスワードなど、-sオプション)
パスワードなど、ユーザーの入力内容を表示したくない場合は、-s
オプションを使います。
read -s -p "パスワードを入力してください:" password
echo
echo "パスワードを受け取りました。"
-s
オプションにより、入力中は画面に何も表示されません。セキュリティが必要な入力には必須のテクニックです。
複数の変数に入力を分割して格納する
read
コマンドは、スペース区切りで複数の変数に値を代入することもできます。
read -p "姓と名を入力してください(例:山田 太郎):" lastname firstname
echo "こんにちは、$firstname さん($lastname さん)"
ユーザーが「山田 太郎」と入力すると、lastname
には「山田」、firstname
には「太郎」がそれぞれ代入されます。
改行なしで入力を促す(-nオプション)
-n
オプションを使うと、特定の文字数だけ読み取ることができます。
read -n 1 -p "続行するには何かキーを押してください:" key
echo
echo "入力されたキー:$key"
この例では、1文字だけを読み取るため、ユーザーがキーを1つ押した時点で次に進みます。
ユーザー入力をデフォルト値付きで処理する
read
にはデフォルト値を直接設定する機能はありませんが、以下のように工夫することで実現可能です。
read -p "名前を入力してください(デフォルト:ゲスト):" name
name=${name:-ゲスト}
echo "ようこそ、$name さん"
ユーザーが何も入力せず Enter を押した場合、変数 name
には「ゲスト」が代入されます。
入力をループ処理で繰り返し受け取る
複数の入力を繰り返し受け取りたい場合は、while
ループとの組み合わせが便利です。
while true
do
read -p "続けますか?(y/n):" answer
case $answer in
[Yy]* ) echo "続けます";;
[Nn]* ) echo "終了します"; break;;
* ) echo "yかnで答えてください";;
esac
done
このスクリプトでは、ユーザーが y
または n
を入力するまで繰り返し質問を続けます。
入力を読み取りながらファイルを処理する(標準入力)
ファイルを1行ずつ読み取るときにもread
は活躍します。
while read line
do
echo "読み込んだ行:$line"
done < sample.txt
このようにすることで、ファイルの中身を1行ずつ処理できます。CSVファイルや設定ファイルなどを扱う際に便利です。
readで気をつけたいポイント
- 入力の末尾に改行があるため、
IFS
(内部フィールド区切り文字)に注意する - 複数変数での入力時、最後の変数には残りすべてが入る
read
は一行ずつしか処理できないため、改行を含む複数行の入力には向かない
まとめ
read
コマンドは、Linuxシェルスクリプトでユーザー入力を扱ううえで欠かせない基本コマンドです。
基本的な使い方だけでなく、オプションや応用的なテクニックを組み合わせることで、よりインタラクティブなスクリプトを作成することができます。タイムアウトの設定やパスワード入力の隠蔽、ループ処理との組み合わせなど、多くのシーンで活用できるので、ぜひ実際に手を動かして試してみてください。