言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. Bash辞典
  3. read

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_name.sh
read -p "名前を入力してください: " name
echo "こんにちは、${name} さん!"
bash read_name.sh
名前を入力してください: Alice
こんにちは、Alice さん!

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

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

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

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

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

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

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

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

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

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

概要

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

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

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