自动执行脚本中可变数量的输入

自动执行脚本中可变数量的输入

我了解自动化交互式脚本的这 3 个选项:

  • 通过管道将答案传递给可执行文件,例如。yes '\n\n\n\n\nY\n' | ./script
  • yes命令对所有问题传递相同的答复
  • expect提供明确的答案

我正在努力解决的是这种情况:

我有一个脚本会问很多问题。问题的数量实际上可能会根据脚本的版本而有所不同。最后一个问题是对之前所有答案的是/否确认。

每个问题都需要您从列表中进行选择。除最后一个问题外,每个问题都有一个默认答案。因此,您只需按“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以便它可以再次匹配给定的模式之一。

答案2

我了解自动化交互式脚本的这 3 个选项:

  • expect提供明确的答案
    • 问题的数量各不相同。我不知道expect是否可以处理这个

我重建了expect解决方案通过@glennjackman并使它与我的一个例子一起工作。这是一个不错的解决方案,但有点复杂。

  • 通过管道将答案传递给可执行文件,例如。yes '\n\n\n\n\nY\n' | ./script

    • 问题数量因脚本版本而异

管道实际上可以工作。是/否问题将被重复,直到有一个好的答案,所以如果你提供足够的换行符,Y 将被找到,并且会有一个幸福的结局。您必须估计选择问题的最大数量(有一些余量)。这是一个简单快速的解决方案使用脚本可以方便地测试各种最大数字。

#!/bin/bash

if [ $# -eq 1 ]
then
 maxq="$1"
else
 echo "Enters default answers to the program 'trfix' and finishes with 'Y' (yes)"
 echo "Usage:   $0 <expected max number of questions>"
 echo "Example: $0 15"
 exit
fi

str="Y\n"
for ((i=0;i<"maxq";i++))
do
 str="\n$str"
done
#echo -en "$str"
echo -en "$str"|./trfix

演示运行有 2 个选择问题,maxq 设置为 5:

$ ./check4Troncoso 5
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*"?
Cancel=N, Download and Install=Y [Y/N] *Type "Y" and press Enter*"?
Cancel=N, Download and Install=Y [Y/N] *Type "Y" and press Enter*"?
Cancel=N, Download and Install=Y [Y/N] *Type "Y" and press Enter*"?
Yes :-)

相关内容