以非交互方式将参数传递给交互式程序,但基于输出

时间:2017-11-08 10:01:56

标签: bash interactive non-interactive

我的问题是对以下passing arguments to an interactive program non interactively的增强。

我正在使用一个脚本,要求我从列表中选择一个选项:

1 - ABC
2 - CDE
3 - EFG

我知道我应该根据字母选择哪个选项,但脚本希望提供一个数字。

有没有办法以非交互方式进行?我的意思是传递一个“参数”,它将根据给定的字母找到一个数字。

[编辑1]

我看到我的描述不是很清楚,因此我添加了一个测试用例。 我有一个脚本:test.sh。它是交互式脚本,因此在运行时会询问问题:

./test.sh
Are you sure you want to run it? (y/n): y
Please choose option:
1 - ABC
2 - CDE
3 - EFG
1

要以非交互方式运行此脚本,我正在使用:

echo "y
1" | test.sh

问题是当我运行脚本时,我不知道哪个号码被分配给我想要选择的选项。

2 个答案:

答案 0 :(得分:0)

您的用例并不是很清楚,但我可以猜测您正在寻找的内容可以通过grep和sed实现。

示例:

cat choices.txt
1 - ABC
2 - CDE
3 - EFG

在choices.txt中找到EFG然后sed获取数字(找到任何数字组,并仅输出该组):

cat choices.txt | grep EFG | sed 's/^\([0-9]*\).*/\1/'
3

答案 1 :(得分:0)

提出这个问题我正在寻找任何提示如何开始这项任务。经过几个小时的搜索后,我终于设法使用expect脚本实现了符合我要求的内容。

如果您对如何改进此脚本有所了解,欢迎提出任何意见。

#!/usr/bin/expect -f

proc parse_output {search_in to_find} {
    set lines [split $search_in \n]
    foreach line $lines {
        if {[regexp "$to_find" $line]} {
            puts $line
            set i [string first "-" $line]
            set n [string range $line 0 [expr {$i-1}]]
            set nn [string trim $n]
            send -- "$nn\r"
        }
    }
}

set PARAM1 [lindex $argv 0]

spawn deploy
expect "?choose change to deploy:"
parse_output $expect_out(buffer) "$PARAM1\r"
expect "$" {send "\r"}