試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

キーボードからの入力を受け付ける対話型プログラムへのデータ入力を自動化(非対話化)する

yesコマンドの使い方」で扱ったように、処理を進めるためにキーボードで何かを入力してEnterを押す必要があるプログラムに対する入力作業を自動化するのにはyesコマンドが役に立つが、入力する内容が必ずしも全て同じ(全てyesもしくは全てno)とは言えない。ここではそういった場合の処理についてを扱う。

  1. テスト用準備:連続したキー入力を確認するスクリプト
  2. キー入力部分をコマンドで出力する
  3. キー入力部分をファイルから読み込んで出力する

テスト用準備:連続したキー入力を確認するスクリプト

連続したキー入力を受け付けつつ、どのような入力を受け取ったかを確認できるようにするため、下のようなスクリプトを用意することにする。
[任意]ファイル名: readtest.sh

#! /bin/sh
# -*- coding: utf-8 -*-

# キーボードからの入力を5回続けて受け付けるテストスクリプト
# 1-3の範囲が有効な選択肢とし、他の入力はエラーとする

for I in $(seq 5); do
  read ACT
  case ${ACT} in
   1)
    echo "You have selected 1."
    ;;
   2)
    echo "You have selected 2."
    ;;
   3)
    echo "You have selected 3."
    ;;
   *)
    echo "Error: invalid number \""${ACT}"\"."
    exit 1
    ;;
  esac
done

これを端末から実行するとキーボードからの入力を受け付ける状態になり、入力した値に応じて出力を行うことを5回繰り返し、途中で無効な入力があった場合はそこで終了する。

$ [readtest.shの場所]
(「1」と入力してEnter)
You have selected 1.
(「2」と入力してEnter)
You have selected 2.
(「3」と入力してEnter)
You have selected 3.
(「2」と入力してEnter)
You have selected 2.
(「1」と入力してEnter)
You have selected 1.

$ [readtest.shの場所]
(「abc」と入力してEnter)
Error: invalid number "abc".

キー入力部分をコマンドで出力する

上のスクリプトのようにキー入力を要求するプログラムに対するキー入力を自動化するためには、その入力の内容をechocatといったコマンドで出力し、それをパイプでスクリプトに渡す(標準入力として用いるようにする)。echoは組み込みコマンド版ではシェルによって「\n」の改行に関する挙動が異なるが、外部コマンド(/bin/echo)では同じように動作する。
以下、「1」「2」「3」「2」「1」の順でキー入力を行うのと同じようにするものとする。

(echoコマンドの例)
bash/zsh$ echo -e "1\n2\n3\n2\n1" | [readtest.shの場所]
You have selected 1.
You have selected 2.
You have selected 3.
You have selected 2.
You have selected 1.
tcsh/dash/zsh$ echo "1\n2\n3\n2\n1" | [readtest.shの場所]
You have selected 1.
You have selected 2.
You have selected 3.
You have selected 2.
You have selected 1.
$ /bin/echo -e "1\n2\n3\n2\n1" | [readtest.shの場所]
You have selected 1.
You have selected 2.
You have selected 3.
You have selected 2.
You have selected 1.

(catコマンドの例)
$ cat <<EOF | [readtest.shの場所]
> 1
> 2
> 3
> 2
> 1
> EOF
You have selected 1.
You have selected 2.
You have selected 3.
You have selected 2.
You have selected 1.

シェルスクリプトに記述する場合はcatコマンドで

#! /bin/sh
cat <<EOF | [readtest.shの場所]
1
2
3
2
1
EOF

のようにする。

キー入力部分をファイルから読み込んで出力する

コマンドによる方法と要領は同じだが、入力するデータをあらかじめ
[任意]ファイル名: input.txt

1
2
3
2
1

このようにテキストファイルに書き込んでおき、それをcatで開いたものを渡すことができる。

$ cat [input.txtの場所] | [readtest.shの場所]
(もしくは)
$ cat < [input.txtの場所] | [readtest.shの場所]
You have selected 1.
You have selected 2.
You have selected 3.
You have selected 2.
You have selected 1.

使用したバージョン: