【问题标题】:Passing arguments to an interactive program non interactively but based on output以非交互方式但基于输出将参数传递给交互式程序
【发布时间】:2017-11-08 10:01:55
【问题描述】:

我的问题是对以下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

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

【问题讨论】:

    标签: bash interactive non-interactive


    【解决方案1】:

    你的用例不是很清楚,但我猜你正在寻找什么可以用 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
    

    【讨论】:

    • 你能发布你的源脚本吗?你在使用select 吗?
    【解决方案2】:

    提出这个问题,我一直在寻找如何开始这项任务的任何提示。经过数小时的搜索后,我终于设法使用expect 脚本实现了满足我要求的某物。

    如果您对如何改进此脚本有任何想法,欢迎任何 cmets。

    #!/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"}
    

    【讨论】:

      猜你喜欢
      • 2013-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 2013-01-01
      • 1970-01-01
      相关资源
      最近更新 更多