書式
read [OPTIONS] [VARIABLES...]

概要

read コマンドは
標準入力から1行読み込んで、
その結果を1つ以上の
シェル変数 に代入します。

以下のオプションがあります。

-c CMD / --command=CMD
CMD を初期文字列に設定する。
-g / --global
グローバル変数にする。
-l / --local
ローカル変数にする。
-m NAME / --mode-name=NAME
NAMEread コマンドが
読み書きする履歴ファイルにする。
fish に指定したときは
通常の履歴ファイルが使われる。
-n NCHARS / --nchars=NCHARS
1行読み込まれるのを待つのではなく、
NCHARS 文字読み込んだら
読み込みを終了させる。
-p PROMPT_CMD / --prompt=PROMPT_CMD

read コマンドが使う
プロンプトを表示するためのシェルコマンドを
PROMPT_CMD に設定する。

デフォルトでは
set_color green; echo read; set_color normal; echo '> '
である。

-R RIGHT_PROMPT_CMD / --right-prompt=RIGHT_PROMPT_CMD
read コマンドが使う
右プロンプトを表示するためのシェルコマンドを
RIGHT_PROMPT_CMD に設定する。
デフォルトでは未定義。
-s / --shell
シンタックスハイライトタブ補完 、コマンドの終端
(訳注:ブロックコマンド入力中は読み込みを継続する)
を有効にする。
シェルスクリプトを読み込むのに最適。
-u / --unexport
変数を export しない。(デフォルト)
-U / --universal
変数を ユニバーサル変数 にする。
-x / --export
変数を export する。
-a / --array
配列変数にする。
1つの変数しか指定できず、
トークンは1つの変数に
配列として代入される。
-z / --null
改行の代わりにNUL文字(\0)まで読み込む。
対話モードを無効にする。

read コマンドは、

  1. 標準入力から1行読み込み、
  2. IFS シェル変数によってトークンに分割し、
  3. トークンを VARIABLES に指定された各々の変数に代入

します。

変数よりもトークンの方が多い場合、
残りはすべて最後の変数に代入されます。

特別なケースとして、
IFS を空文字列に設定したとき、
1文字が1トークンになります。

詳しくは 変数のスコープ
参照してください。

実行例

以下は $foo にhelloを代入します。

$ echo hello|read foo
$ echo $foo
hello

ここから例追加。

初期文字列をHOGEにして
read コマンドを実行し、
変数 $a に代入します。

そのままEnterを押すと
このようになります。

$ read -cHOGE a; echo $a
read> HOGE
HOGE

2文字を読み込んだら即終了します。

$ read -n2 a; echo $a
read> ab
ab

プロンプトを「what: 」にします。

$ read -p'echo "what: "' a; echo $a
what: read
read

シェルスクリプトを入力し、
eval で実行します。

$ read -s a; echo $a
read> for x in 1 2 3
          echo $x
      end
for x in 1 2 3
echo $x
end
$ eval $a
1
2
3

複数個の変数を指定した場合の
渡り方はこのようになります。

$ read a b c ; echo "$a:$b:$c"
read> 1 2 3 4
1:2:3 4
$ read a b c ; echo "$a:$b:$c"
read> 1 2
1:2:

以下の例では、
配列として格納されます。

$ read -a a; echo $a[2]
read> 1 2 3 4
2

IFS 変数を設定することで、
文字の区切りを設定します。

$ begin set -l IFS ''; echo abcd | read a b c; echo $b; end
b
$ begin set -l IFS ':'; echo a:b:c:d | read a b c; echo $c; end
c:d

最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。