使い方
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
標準入力、 または -u
オプションの引き数として指定されたファイル・ディスクリプター fd から 1 行を読み込み、最初の単語を最初の name
に代入し、2 番目の単語を 2 番目の name
に代入する。以降も同様です。 余った単語とそれらの間の区切り文字は、最後の name
に代入されます。 name
よりも標準入力から読み込んだ単語の方が少ない場合には、 余っている name
には空文字列が値として代入されます。IFS
中の文字が、行を単語に分割するために使われます。 バックスラッシュ文字 (\
) を使うと、 次に読み込んだ文字の特殊な意味を消したり、行を連結したりできます。 オプションが与えられていれば、以下の意味を持ちます:
-a aname
単語を配列変数 aname にインデックス順に代入します。インデックスは 0 から始まります。 新しい値が代入される前に aname は削除されます。他の name 引き数は無視されます。
-d delim
改行ではなく、delim の最初の文字が、入力行を終了するために使われます。
-e
標準入力を端末から読み込む場合、 readline (前述の READLINE ライブラリ のセクションを参照) を使って行を取得します。 readline は現在の (行編集がそれまで有効になっていなければデフォルトの) 編集設定を使います。
-i text
行を取得するのに readline が使われるとき、入力を開始する前に編集バッファに text が置かれます。
-n nchars
組み込みコマンド read は、 入力行全体が読み込まれるのを待たず、 nchars 文字を読み込んだ時点で戻ります。 ただし、nchars 文字が読み込まれる前に区切り文字が現われたときは、 区切り文字を優先します。
-N nchars
入力行全体が読み込まれるのを待たず、 nchars 文字を読み込んだ時点で戻ります。 ただし、入力に EOF が現れたときや、 read がタイムアウトになったときを除きます。 入力に区切り文字が現れても特別扱いはせず、 nchars 文字を読み込むまでは read が戻ることはありません。
-p prompt
入力を読み込もうとする前に標準エラー出力に prompt を表示します。 末尾に改行は付きません。 プロンプトが表示されるのは、入力を端末から読み込む場合だけです。
-r
バックスラッシュはエスケープ文字として作用しません。 バックスラッシュは行の一部とみなされます。 特に、バックスラッシュと改行の組み合わせを使って 複数の行を接続することはできません。
-s
静かな (silent) モード。端末に入力が行われても、文字はエコーされません。
-t timeout
入力行全体が timeout 秒以内で読み込まれない場合、 read をタイムアウトさせて、失敗の状態を返します。 timeout は小数部を持つ十進数でもかまいません。 このオプションは、 read が入力を端末やパイプ、その他の特殊ファイルから 読み込んでいる場合にのみ効果があります。 通常のファイルから読み込んでいる場合には影響ありません。 timeout が 0 のときは、read は指定したファイル・ディスクリプター から読み込める状態であれば成功の状態を返し、そうでなければ失敗の状態を返します。 タイムアウト時間を超えた場合、終了ステータスは 128 より大きい値になります。
-u fd
ファイル・ディスクリプター fd から入力を読み込みます。
name
が全く与えられていない場合、読み込まれた行は変数 REPLY
に代入されます。 ファイル末尾に到達した場合、 read
がタイムアウトした場合 (この場合には終了ステータスは 128
より大きい値になります)、 -u
の引き数として不正なファイル・ディスクリプターが指定した場合以外は、 終了コードは 0
です。
ドキュメント:
Man page of BASH_BUILTINS | JM Project
参考:
read コマンド – 標準入力から変数に代入する | Linuxコマンド.NET
キーボードからの入力を受け付ける方法 | server-memo.net
read コマンドについて整理してみた | Shiro’s secret base
read – 読み出したファイルを解釈する | 日経クロステック
文字列を配列に分割する
参考:
Split String into Array | Linux Hint
Split String into Array Using 4 Simple Methods | GoLinuxCloud
How to convert a string into array – Unix & Linux Stack Exchange
How to split a string into an array? – Stack Overflow
IFS
参考:
read するときは IFS= を付けておくと strict な感じで気持ちが良い – Qiita
Readline を使う (read -e)
参考:
Use a separate history for ‘read -e’ (readline) – Super User