Shell-Script
自動化腳本中可變數量的輸入
我了解自動化互動式腳本的這 3 個選項:
- 管道答案到執行檔,例如。
yes '\n\n\n\n\nY\n' | ./script
yes
命令對所有問題傳遞相同的答复expect
提供明確的答案我正在苦苦掙扎的是這種情況:
我有一個腳本會問很多問題。問題的數量實際上可能因腳本的版本而異。最後一個問題是對所有先前答案的 Y/N 確認。
每個問題都有您從列表中選擇。除了最後一個問題外,每個問題還有一個預設答案。因此,您只需按“Enter”即可接受預設值。
我想發生的事情:
執行腳本時,接受所有問題的預設值並為最後一個問題選擇“Y”。
為什麼我不能(我不認為)使用上述選項:
- 管道 - 問題的數量因腳本版本而異
yes
命令 - 這不能解釋最後一個問題,即 Y/Nexpect
命令 - 問題的數量各不相同。我不知道期望是否可以處理這個所以這裡有一個小樣本:
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 :-)