スクリプト内の可変数の入力自動化

スクリプト内の可変数の入力自動化

私は対話型スクリプトを自動化するための3つのオプションを理解しています。

  • 実行可能ファイルへの応答をパイプします。yes '\n\n\n\n\nY\n' | ./script
  • yesCommand は、すべての質問に対して同じ応答を提供します。
  • expect明確な回答を提供

私が経験している状況は次のとおりです。

多くの質問をするスクリプトがあります。実際、質問の数はスクリプトのバージョンによって異なります。最後の質問は、以前のすべての回答のYes / Noチェックです。

各質問にはリストから選択する必要があります。最後の質問を除くすべての質問には基本的な答えがあります。したがって、Enterキーを押してデフォルト値を適用できます。

私がしたいこと:

スクリプトを実行するときは、すべての質問に対してデフォルト値を受け入れ、最後の質問には「Y」を選択します。

上記のオプションが利用できないのはなぜですか?

  • パイプライン - 問題の数はスクリプトのバージョンによって異なります。
  • yesコマンド - これは、はい/いいえの最後の質問を説明しません。
  • expectコマンド - 質問の数はさまざまです。 Expectがこの問題を処理できるかどうかはわかりません。

以下は小さなサンプルです。

Installation Choice for Product A
********************************************************

0. Do not install Product A
1. Install Product A Version - 1.0.1.7
2. Install Product A Version - 1.1.4.8

ANSWER [0]: *Press Enter*

Installation Choice for Product B
********************************************************

0. Do not install Product B
1. Install Product B Version - 10.0.1.4239.03
2. Install Product B Version - 10.0.1.4239.04

ANSWER [2]: *Press Enter*

The package versions below have been selected for installation?

Product A   Do not install                 
Product B   10.0.1.4239.04

Cancel=N, Download and Install=Y [Y/N] *Type 'Y' and press Enter*

質問ごとに基本的な回答が異なるため、「デフォルト」を使用する以外に正解が何であるかさえわかりません。

最終警告:実行したいスクリプトを編集できません。

ベストアンサー1

予想されるスクリプトは次のとおりです。

#!/usr/bin/expect
exp_internal 1 ; # remove this when you're done testing.

spawn /path/to/your/program

set timeout -1
expect {
    -re {ANSWER \[\d+\]: $} {
        send "\r"
        exp_continue
    }
    {Cancel=N, Download and Install=Y} {
        send "Y\r"
    }
}
expect eof

秘密の要素は、exp_continue基本的にコマンドの一番上に「ループ」して、与えられたexpectパターンの1つと再一致できるようにすることです。

おすすめ記事