【シェルスクリプト】キーボードからの入力を受け付ける方法

シェルスクリプトでキーボードからの入力を受け付ける方法です。

キーボードからの入力を受け付けるには?

「read」コマンドを使用することで、キーボードから入力した内容を変数に格納することが出来ます。

read 変数名

入力したキーの内容を表示

下記は入力したキーの内容を変数「DATA」へ格納し、その内容を表示させるというスクリプトになります。

#!/bin/bash
echo -n "Press any key: "
read DATA
echo ""
echo "Entered key: $DATA"

実際にスクリプトを実行して「a」キーを入力してみると、入力した値が表示されることが確認できます。

$ sh ./read_1.sh
Press any key: a

Entered key: a

「-p」オプションを使うことで、こんな風に書くこともできます。

read -p "表示させたい文" 変数

実際に「-p」オプションを使用してスクリプトを作成してみます。

#!/bin/bash
read -p "Press any key: " DATA
echo ""
echo "Entered key: $DATA"

何かキーを入力することで処理を継続

「read」でキーを読み込んだ後に、特に何も処理を指定しなければそのまま処理が継続します。

これを利用することで、何かキーが入力されるまで処理を停止させておくといった使い方もできます。

#!/bin/bash
read -p "Press any key: " DATA
echo ""
echo "Start !!"

何もキーを入力しなければ「Press any key:」と表示されて、そこで処理が一時停止したままとなります。

$ sh ./read_3.sh
Press any key:

何かキーを入力することで処理が継続されて「Start !!」と表示されます。

$ sh ./read_3.sh
Press any key: a

Start !!

入力したキーにより処理を分岐させる

case文と組み合わせることで、入力されたキーの内容によって分岐させて処理を実行させることが出来ます。

「y」を入力した場合は「OK」を、「n」を入力した場合は「NG」と表示し、それ以外の場合は「Push y or n key.」と表示させるスクリプトになります。

#!/bin/bash
read -p "Are you ok ? (y/n): " DATA
case "$DATA" in
  [yY]) echo "OK" ;;
  [nN]) echo "NG" ;;
  *) echo "Push y or n key."
esac
$ sh read_4.sh
Are you ok ? (y/n): y
OK

$ sh read_4.sh
Are you ok ? (y/n): n
NG

$ sh read_4.sh
Are you ok ? (y/n): a
Push y or n key.

入力したキーにより処理を繰り返す

入力した内容によって処理を繰り返したい場合は、while文と組み合わせてください。

「Repeat ?(y/n):」と表示された後に「y」を入力すると処理を繰り返して、また「Repeat ?(y/n):」と表示して入力待ちとなります。

「n」を入力すると「End repead.」と表示して「break」によって繰り返し処理から抜けます。

「y」と「n」以外が入力された場合は「Input y or n key」と表示して、再度「Repeat ?(y/n):」と表示して入力待ちとなります。

#!/bin/bash
while :
do
  read -p "Repeat ? (y/n): " DATA
    if [ "$DATA" = "y" ]; then
      echo "Repeat !!"
    elif [ "$DATA" = "n" ]; then
      echo "End repead."
      break
    else
      echo "Input y or n key"
  fi
done
$ sh ./read_5.sh
Repeat ? (y/n): y
Repeat !!
Repeat ? (y/n): a
Input y or n key
Repeat ? (y/n): n
End repead.

複数の入力を受け付ける

変数を複数用意することで複数の入力を受け付けることができます。

#!/bin/bash

read -p "Press any key: " DATA1 DATA2 DATA3
echo ""
echo "Entered key: $DATA1"
echo "Entered key: $DATA2"
echo "Entered key: $DATA3"

上記のスクリプトでは、「DATA1」「DATA2」「DATA3」という3つの変数を用意しているので「スペース(タブでも可)」で区切った3つの値を変数に格納することが出来ます。

$ sh ./read_7.sh
Press any key: aa bb cc

Entered key: aa
Entered key: bb
Entered key: cc

区切りの文字を変更したい場合

区切りの文字は、環境変数の「IFS」を使用することで変更することができます。

下記スクリプトでは区切りの文字を「,」に変更しています。

#!/bin/bash

IFS=, read -p "Press any key: " DATA1 DATA2 DATA3
echo ""
echo "Entered key: $DATA1"
echo "Entered key: $DATA2"
echo "Entered key: $DATA3"

区切りを「,」に変更したので、スペースの場合は一つのデータとして変数に格納されてしまします。

$ sh ./read_IFS.sh
Press any key: aa bb vv

Entered key: aa bb vv
Entered key:
Entered key:

「,」で区切って入力すると、「aa」「bb」「cc」とそれぞれ別の変数に格納されました。

$ sh ./read_IFS.sh
Press any key: aa,bb,cc

Entered key: aa
Entered key: bb
Entered key: cc

オプション色々

色々オプションはありますが、覚えておくと役に立ちそうなオプションです。

オプション 説明
-a 変数 入力した値を配列変数に格納する
-n 文字数 文字数で指定した分だけ読み込む
-p 文字列 文字列で指定したものをプロンプトとして表示させて入力待ちになる
改行文字が入力されると入力受付終了
-r \(バックスラッシュ)をそのまま読み取る
-s 入力した文字を表示させない
-t 秒数 タイムアウト時間を設定

-a オプション(配列変数に格納)

「-a」オプションを使用することで、入力した複数のデータを配列変数に格納することができます。

#!/bin/bash

read -a DATA -p "Press any key: "
echo ""
echo "Entered key: ${DATA[0]}"
echo "Entered key: ${DATA[1]}"
echo "Entered key: ${DATA[2]}"

実際に複数の値を入力して配列変数に格納してみます。

$ sh read_a.sh
Press any key: a b c

Entered key: a
Entered key: b
Entered key: c

-n オプション (格納する文字数の設定)

「-n 文字数」オプションを使用することで、変数に格納する文字数を指定することが出来ます。

下のスクリプトは「-n 2」としているので、2文字のみ変数に格納するというスクリプトになります。

$ cat read_n.sh
#!/bin/bash

read -n 2 -p "Press any key: " DATA
echo ""
echo "Entered key: $DATA"

キーボードで直接入力すると「2文字」キーを入力した時点で、自動的に入力処理が終了して値が変数に格納されてしまいます。

$ sh read_n.sh
Press any key: ab
Entered key: ab

コピペで2文字以上の文字を入力した場合も、「-n」オプションで指定した文字の分だけが変数に格納されます。

$ sh read_n.sh
Press any key: 12345
Entered key: 12

-p オプション (文字列をプロンプトに表示)

「-p」オプションを使用することで指定した文字列を表示させることができます。

このページでは何度も使っていますが、使用例は下記のようになります。

#!/bin/bash
read -p "Press any key: " DATA
echo ""
echo "Entered key: $DATA"

-r オプション (バックスラッシュを文字列として読み取る)

通常「\(バックスラッシュ)」は入力してもエスケープされてしまいます。

$ sh ./read_1.sh
Press any key: ab\cde

Entered key: abcde

「-r」オプションを使用すると「\(バックスラッシュ)」を文字列として変数に格納することが出来ます。

#!/bin/bash

read -r -p "Press any key: " DATA
echo ""
echo "Entered key: $DATA"
$ sh ./read_r.sh
Press any key: ab\cde

Entered key: ab\cde

-s オプション (入力した文字を表示させない)

「-s」オプションを使用することで、画面上に入力した文字を表示させなくすることが出来ます。

パスワードの入力などを求める際には役立つでしょう。

#!/bin/bash

read -s -p "Press any key: " DATA
echo ""
echo "Entered key: $DATA"

「abc」と入力したのですが、入力した文字は画面に表示されずに変数「$DATA」に格納されていることが確認できます。

$ sh ./read_s.sh
Press any key:
Entered key: abc

-t オプション (入力タイムアウト時間を設定)

「-t」オプションを使用すると入力待ち時間に制限を付けることが出来ます。

使用例としては、一定時間入力が無い場合に、自動的に処理を継続させるといった処理をさせることが出来ます。

#!/bin/bash

read -t 5 -p "Press any key: " DATA
echo ""
echo "Entered key: $DATA"

下のスクリプト実行例では分かりづらいですが、何も入力せずに5秒経過すると自動的に処理が実行され、変数に何も値が格納されず空欄で表示されていることが分かります。。

$ sh read_t.sh
Press any key:
Entered key:

シェアする