No.013シェル
read
リード・標準入力読み込み
標準入力から値を読み取り、変数へ代入します。対話入力、ファイル1行読み込み、whileループでの逐次処理に広く使われます。
答えよく使う形
$ printf "%sn" "hello world" | while IFS= read -r line; do printf "%sn" "$line"; done
hello world
$ read name
printf "%sn" "$name"
入力した値
$ read name
練習用の部屋です。何を打っても本物は変わりません。本物の Linux で続ける →
覚える順番の中でLPIC-1・44 駅め / 106
どんなコマンド?
利用者から値を受け取りたい時、ファイルを1行ずつ処理したい時、シェルスクリプトで入力を変数へ格納したい時に使います。
readは、標準入力からデータを読み取り、シェル変数へ格納するための組み込みです。シェルスクリプトでは、利用者からの入力受付、設定ファイルの1行ずつ処理、パイプで流れてくる内容の読込などに使います。
特に重要なのは、行を壊さず安全に読むためのIFS= read -rという書き方です。IFSを空にして先頭や末尾の空白を保ち、-rでバックスラッシュを特別扱いしないようにすると、入力をより素直に受け取れます。
一方で、パイプの右側でwhile readを使うと、シェル実装によってはサブシェルで動き、ループ内で更新した変数が外へ残らないことがあります。この挙動差は実務でもよく問題になります。
書き方とオプション
組み立ててみるオプションを押すと、下の1行に足されます。もう一度押すと外れます。
$ read
使用例と実行結果
行を押すとコピーできます。
hello world
入力した値
まず安全に試す
3分ミッション
手を動かすと覚えやすくなります。できたものに印を付けてください(この端末に残ります)。
0 / 2
つまずいたとき
空白を含む入力が途中で切れた
原因IFSや変数の扱いを誤り、単語分割の影響を受けています。
こうする行全体を受けるならIFS= read -r lineを基本にします。
while read内で更新した変数がループ外で残らない
原因パイプラインの都合でサブシェル側でループが動いています。
こうする可能ならリダイレクト入力を使い、while ...; done < fileの形にします。
終わったときの数(戻り値)
$ echo $?
- 01行読み取りに成功しました。
- 1入力終端へ到達しました。while readループでは自然終了として使われます。
- >1不正なオプションなどのエラーが起きました。
気をつけることと入れ方
入力の引用やIFS設定を誤ると、空白が崩れたりバックスラッシュが消えたりします。秘密情報を読む場面では画面表示や履歴に残さない工夫も必要です。
シェル(bash など)に組み込まれたコマンドです。入れるものはありません。
環境による違い
POSIXのreadは基本機能のみです。-pや-sなどはBashで便利ですが、移植性が必要なら最小限の書式に寄せる必要があります。安全な既定形としてIFS= read -rがよく使われます。
確かめた環境Debian GNU/Linux / 13 / Bash 5.2.372026-04-09 に確認
よくある質問
なぜIFS= read -rが定番なのですか。
空白を保ち、バックスラッシュを消さず、入力をできるだけそのまま受け取れるからです。
readは外部コマンドですか。
いいえ。通常はシェル組み込みで、現在のシェル変数へ値を入れるために組み込みである必要があります。
資格試験では
- LinuC レベル1大事1.06 シェルスクリプトLinuCレベル1では、シェルスクリプトの作成、条件判定、入力処理が問われます。readはその基礎部品として重要です。
- LPIC-1大事105.2 簡単なスクリプトをカスタマイズするLPIC-1では、単純なシェルスクリプトの分岐と入力処理が出題対象です。readはその基本構成要素です。
- 共通基礎大事Linuxコマンド基礎
read を最後まで読みました。
Linux コマンド辞典に戻る91 / 144