我的问题是对以下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
问题是当我运行脚本时,我不知道哪个号码被分配给我想要选择的选项。
答案 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"}