Shell-Script

自動化腳本中可變數量的輸入

  • December 22, 2018

我了解自動化互動式腳本的這 3 個選項:

  • 管道答案到執行檔,例如。yes '\n\n\n\n\nY\n' | ./script
  • yes命令對所有問題傳遞相同的答复
  • expect提供明確的答案

我正在苦苦掙扎的是這種情況:

我有一個腳本會問很多問題。問題的數量實際上可能因腳本的版本而異。最後一個問題是對所有先前答案的 Y/N 確認。

每個問題都有您從列表中選擇。除了最後一個問題外,每個問題還有一個預設答案。因此,您只需按“Enter”即可接受預設值。

我想發生的事情:

執行腳本時,接受所有問題的預設值並為最後一個問題選擇“Y”。

為什麼我不能(我不認為)使用上述選項:

  • 管道 - 問題的數量因腳本版本而異
  • yes命令 - 這不能解釋最後一個問題,即 Y/N
  • 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*

您會注意到每個問題都有不同的預設答案,所以除了使用“預設”之外,我什至不知道正確答案應該是什麼。

最後警告:我無法編輯我試圖執行的腳本。

這是您的期望腳本:

#!/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命令的頂部,因此它可以再次匹配給定模式之一。

我了解自動化互動式腳本的這 3 個選項:

  • expect提供明確的答案

+ 問題的數量不同。我不知道期望是否可以處理這個

通過@glennjackman****expect重建了解決方案,並使其與我的一個範例一起使用。這是一個不錯的解決方案,但有點複雜。

  • 管道答案到執行檔,例如。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 :-)

引用自:https://unix.stackexchange.com/questions/490362