Seleção de script de opções dentro do programa em execução

0

Eu quero rodar um programa que espera que duas entradas após a execução decidam como ele será executado. Assim:

$ program <input_file>
Running program
1. Option one
2. Option two
select an option: <Expects '1' or '2'>

3. Option three
4. Option four
select an option: <Expects '3' or '4'>

Running with selected options.

Eu gostaria de executá-lo para muitos arquivos de entrada para os quais as mesmas opções serão selecionadas. Agora eu faço:

$ for i in *; do program $i; done

Com isso eu tenho que selecionar as opções manualmente para cada arquivo. Como posso passar as opções para o programa para automatizá-lo? Algo como:

$ for i in *; do program $i < <options>; done

O programa repete as opções disponíveis se o correto não estiver selecionado. Então, quando tentei com {echo 2; echo 4} e echo "2\n4\n" , fica preso na primeira seleção de opções.

    
por izxle 08.02.2018 / 16:50

2 respostas

0

Uma opção é Elseif all

IF "%ID%"=="0" ( ... & ... & ... ) ELSE ^
IF "%ID%"=="1" ( ... ) ELSE ^
IF "%ID%"=="2" ( ... ) ELSE ^
REM default case...

Segunda opção

echo Choose from the list given below:
echo [1] Option 1
echo [2] Option 2
echo [3] Option 3

set /a one=1
set /a two=2
set /a three=3
set /a four=4
set input=
set /p input= Enter your choice:
if %input% equ %one% goto Z if NOT goto Start2
if %input% equ %two% goto X if NOT goto Start2
if %input% equ %three% goto C if NOT goto Start2
if %input% geq %four% goto N

:Z
cls
echo You have selected : Option 1
set option=Option 1
echo %year%
call:branches option

pause
exit

Fonte

Thread StackOverflow eles têm mais conhecimento em linguagem batch e de programação

    
por 08.02.2018 / 17:17
0

when I tried with {echo 2; echo 4} and echo "2\n4\n" it gets stuck on the first option selection.

Não está claro para mim como você tentou isso, mas:

  • {echo 2; echo 4} é sintaticamente inválido; você quer { echo 2; echo 4; } ;
  • echo "2\n4\n" apenas imprime 2\n4\n ; você quer echo -ne "2\n4\n" (nota: várias implementações de echo podem se comportar de maneira diferente, mas como echo é embutido em bash e você marcou bash , eu suponho que você use o builtin).

Eu diria que isso pode funcionar:

for i in *; do { echo 2; echo 4; } | program "$i"; done

Eu posso imaginar program silenciosamente esgota e descarta seu stdin antes de pedir opções, ou usa outro truque que faz a solução acima falhar. Nesse caso, tente expect , se disponível.

man 1 expect declara:

expect is a program that "talks" to other interactive programs according to a script. Following the script, expect knows what can be expected from a program and what the correct response should be.

[…]

In general, expect is useful for running any program which requires interaction between the program and the user. All that is necessary is that the interaction can be characterized programmatically.

Este exemplo envia 2 e 4 quando o programa solicita:

expect -c '
        spawn program ./input_file
        expect "2. Option two"
        expect "select an option:*"
        send "2\r"
        expect "4. Option four"
        expect "select an option:*"
        send "4\r"
        expect eof'

Usar isso com variáveis shell requer cotação e escape adequados:

for i in *; do
  expect -c "
        spawn program \"$i\"
        expect \"2. Option two\"
        expect \"select an option:*\"
        send \"2\r\"
        expect \"4. Option four\"
        expect \"select an option:*\"
        send \"4\r\"
        expect eof"
done
    
por 10.02.2018 / 00:54