概要
標準入力から値を読み取り、変数へ代入します。対話入力、ファイル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分ミッション
少しでも手を動かすと定着しやすくなります。終わった項目にチェックを入れてください。
-
read nameで値を受け取り、printfで表示して変数代入を確認します。
-
2行のテキストファイルを作り、while IFS= read -rで順番に表示します。
資格試験との関連
-
LinuC レベル1
範囲: 1.06 シェルスクリプト根拠: officialLinuCレベル1では、シェルスクリプトの作成、条件判定、入力処理が問われます。readはその基礎部品として重要です。
-
LPIC-1
範囲: 105.2 簡単なスクリプトをカスタマイズする根拠: officialLPIC-1では、単純なシェルスクリプトの分岐と入力処理が出題対象です。readはその基本構成要素です。
-
共通基礎
範囲: Linuxコマンド基礎根拠: editorial試験横断で、readはコマンドライン操作、手順読解、トラブルシュートの基礎体力を作る項目です。
実行結果サンプル
-
printf "%sn" "hello world" | while IFS= read -r line; do printf "%sn" "$line"; donehello world -
read name printf "%sn" "$name"入力した値
戻り値コード
- 0 1行読み取りに成功しました。
- 1 入力終端へ到達しました。while readループでは自然終了として使われます。
- >1 不正なオプションなどのエラーが起きました。
使用例
read nameIFS= read -r lineread -p "名前: " namewhile 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. いいえ。通常はシェル組み込みで、現在のシェル変数へ値を入れるために組み込みである必要があります。
関連用語
参照リンク
- カテゴリー: Shell And Cli
- シェル依存: Posix Sh
- レベル: Basic
- 対応試験: LinuC, LinuC レベル1, LPIC, LPIC-1, 共通基礎