Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

read

『read』は標準入力(キーボード入力)や行データを変数に読み込む組み込みコマンドです。ユーザーへの対話的な入力プロンプト表示や、テキストファイルの行単位処理に使います。

構文
# 標準入力を変数に読み込む
read 変数名

# プロンプトを表示して入力を受け付ける(-p)
read -p "入力してください: " 変数名

# パスワードのように入力を非表示にする(-s)
read -s -p "パスワード: " 変数名

# 配列として読み込む(-a)
read -a 配列名

# while ループでファイルを1行ずつ処理
while read line; do
    echo "$line"
done < ファイル名
オプション一覧
オプション概要
-p "プロンプト"入力前にプロンプト文字列を表示します。
-s入力を画面に表示しないサイレントモードです(パスワード入力向け)。
-rバックスラッシュをエスケープとして解釈しません(ファイル読み込みで推奨)。
-a 配列名スペース区切りの入力を配列として読み込みます。
-n 文字数指定文字数を読み込んだら自動的に終了します。
-t タイムアウト指定秒数で入力待ちをタイムアウトします。
-d 区切り文字改行の代わりに指定文字を入力の終端とします。
-u ファイル記述子指定したファイル記述子から読み込みます。
サンプルコード

『-p』オプションでプロンプトを表示して入力を受け付けます。

read -p "名前を入力してください: " name
echo "こんにちは、${name} さん!"
名前を入力してください: Alice
こんにちは、Alice さん!

『-s』オプションで入力を非表示にします。パスワード入力に使います。

read -s -p "パスワード: " password
echo ""
echo "パスワードを受け付けました(文字数: ${#password})"
パスワード:
パスワードを受け付けました(文字数: 8)

『-t』オプションでタイムアウトを設定します。指定秒数以内に入力がないと終了ステータス 1 を返します。

read -t 10 -p "続行しますか? [y/N]: " answer
if [ $? -ne 0 ]; then
    echo "タイムアウト。処理を中断します。"
    exit 1
fi
[ "$answer" = "y" ] || { echo "中断しました。"; exit 0; }
続行しますか? [y/N]: y

『-a』オプションでスペース区切りの入力を配列として受け取ります。

read -a -p "フルーツを入力(スペース区切り): " fruits
echo "1番目: ${fruits[0]}"
echo "すべて: ${fruits[@]}"
フルーツを入力(スペース区切り): apple banana cherry
1番目: apple
すべて: apple banana cherry

ファイルを1行ずつ読み込んで処理します。『IFS=』で先頭・末尾の空白を保持し、『-r』でバックスラッシュのエスケープ解釈を防ぎます。

while IFS= read -r line; do
    echo "行: $line"
done < /etc/hosts
行: 127.0.0.1   localhost
行: ::1         localhost

パイプからの入力も同様に処理できます。

ls /var/log/*.log | while read -r logfile; do
    size=$(wc -l < "$logfile")
    echo "$logfile: ${size}行"
done
/var/log/syslog.log: 1520行
/var/log/auth.log: 340行
概要

ファイルを1行ずつ読み込む場合は while IFS= read -r line が定番です。IFS= で先頭・末尾の空白を保持し、-r でバックスラッシュのエスケープ解釈を防ぎます。

-t オプションでタイムアウトを設定すると、操作なしでスクリプトが止まらないようにできます。-s-p を組み合わせたパスワード入力パターンはインストーラースクリプトでよく使われます。ループの詳細は while / until も参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。