read リード

英語表記read

日本語表記標準入力読み込み

正式名称read

危険度安全

What does it mean?

標準入力から値を読み取り、変数へ代入します。対話入力、ファイル1行読み込み、whileループでの逐次処理に広く使われます。

Command Quest

read を今日の道具にする

標準入力から値を読み取り、変数へ代入します。対話入力、ファイ...

$ read [オプション] [名前 ...]
関連用語7
次のコマンド0
FAQ2
参照4

概要

標準入力から値を読み取り、変数へ代入します。対話入力、ファイル1行読み込み、whileループでの逐次処理に広く使われます。

基本構文

read [オプション] [名前 ...]

詳細解説

readは、標準入力からデータを読み取り、シェル変数へ格納するための組み込みです。シェルスクリプトでは、利用者からの入力受付、設定ファイルの1行ずつ処理、パイプで流れてくる内容の読込などに使います。

特に重要なのは、行を壊さず安全に読むためのIFS= read -rという書き方です。IFSを空にして先頭や末尾の空白を保ち、-rでバックスラッシュを特別扱いしないようにすると、入力をより素直に受け取れます。

一方で、パイプの右側でwhile readを使うと、シェル実装によってはサブシェルで動き、ループ内で更新した変数が外へ残らないことがあります。この挙動差は実務でもよく問題になります。

このコマンドを使う場面

利用者から値を受け取りたい時、ファイルを1行ずつ処理したい時、シェルスクリプトで入力を変数へ格納したい時に使います。

まず安全に試す方法

1. printf "%sn" "alpha beta" | while IFS= read -r line; do printf "%sn" "$line"; done
2. read name

3分ミッション

少しでも手を動かすと定着しやすくなります。終わった項目にチェックを入れてください。

  1. read nameで値を受け取り、printfで表示して変数代入を確認します。

  2. 2行のテキストファイルを作り、while IFS= read -rで順番に表示します。

資格試験との関連

  • LinuC レベル1
    範囲: 1.06 シェルスクリプト
    根拠: official
    LinuCレベル1では、シェルスクリプトの作成、条件判定、入力処理が問われます。readはその基礎部品として重要です。
  • LPIC-1
    範囲: 105.2 簡単なスクリプトをカスタマイズする
    根拠: official
    LPIC-1では、単純なシェルスクリプトの分岐と入力処理が出題対象です。readはその基本構成要素です。
  • 共通基礎
    範囲: Linuxコマンド基礎
    根拠: editorial
    試験横断で、readはコマンドライン操作、手順読解、トラブルシュートの基礎体力を作る項目です。

オプション

  • -r
    バックスラッシュをエスケープ文字として扱わず、そのまま読み込みます。
    IFS= read -r line
  • -p プロンプト
    Bashで入力前に案内文を表示します。
    read -p "名前: " name
  • -s
    Bashで入力文字を画面へ表示しません。秘密情報入力で便利です。
    read -s password

実行結果サンプル

  • printf "%sn" "hello world" | while IFS= read -r line; do printf "%sn" "$line"; done
    hello world
  • read name printf "%sn" "$name"
    入力した値

戻り値コード

  • 0 1行読み取りに成功しました。
  • 1 入力終端へ到達しました。while readループでは自然終了として使われます。
  • >1 不正なオプションなどのエラーが起きました。

使用例

  • read name
  • IFS= read -r line
  • read -p "名前: " name
  • while IFS= read -r line; do printf "%sn" "$line"; done < file.txt

よくあるエラー

  • 空白を含む入力が途中で切れた
    原因: IFSや変数の扱いを誤り、単語分割の影響を受けています。
    対処: 行全体を受けるならIFS= read -r lineを基本にします。
  • while read内で更新した変数がループ外で残らない
    原因: パイプラインの都合でサブシェル側でループが動いています。
    対処: 可能ならリダイレクト入力を使い、while ...; done < fileの形にします。

導入・互換性情報

POSIXのreadは基本機能のみです。-pや-sなどはBashで便利ですが、移植性が必要なら最小限の書式に寄せる必要があります。安全な既定形としてIFS= read -rがよく使われます。

  • Debian GNU/Linux / 13 / Bash 5.2.37

注意点 / セキュリティリスク

入力の引用やIFS設定を誤ると、空白が崩れたりバックスラッシュが消えたりします。秘密情報を読む場面では画面表示や履歴に残さない工夫も必要です。

FAQ

  • Q. なぜIFS= read -rが定番なのですか。
    A. 空白を保ち、バックスラッシュを消さず、入力をできるだけそのまま受け取れるからです。
  • Q. readは外部コマンドですか。
    A. いいえ。通常はシェル組み込みで、現在のシェル変数へ値を入れるために組み込みである必要があります。

関連用語

  • シェル
  • Bash
  • Zsh
  • Fish
  • POSIXシェル
  • 標準入力
  • Bash scripting

参照リンク

関連記事