Я хочу запустить программу, которая ожидает два ввода после выполнения, чтобы решить, как она будет работать. Вот так:

$ 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.

Я хотел бы запустить его для многих входных файлов, для которых будут выбраны те же параметры. Прямо сейчас я делаю:

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

При этом я должен выбрать параметры вручную для каждого файла. Как я могу передать опции программе, чтобы автоматизировать это? Что-то вроде:

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

Программа повторяет доступные опции, если не выбрана правильная. Поэтому, когда я попытался с {echo 2; echo 4} и echo "2\n4\n" застревает при первом выборе опции.

2 ответа2

0

когда я попытался с {echo 2; echo 4} и echo "2\n4\n" застревает при первом выборе опции.

Мне не понятно, как вы это попробовали, но:

  • {echo 2; echo 4} синтаксически неверен; ты хочешь { echo 2; echo 4; } ;
  • echo "2\n4\n" просто печатает 2\n4\n ; Вы хотите echo -ne "2\n4\n" (примечание: различные реализации echo могут вести себя по-разному, но поскольку echo является встроенным в bash а вы пометили , я предполагаю, что вы используете встроенный).

Я бы сказал, что это может сработать:

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

Я могу себе представить, что program молча истощает и отбрасывает свой стандартный ввод перед тем, как запрашивать параметры, или использует другой прием, который приводит к сбою вышеуказанного решения. В этом случае попробуйте expect , если доступно.

man 1 expect состояния:

expect это программа, которая "общается" с другими интерактивными программами по сценарию. Следуя сценарию, expect знает, чего можно ожидать от программы и каков должен быть правильный ответ.

[...]

В общем, expect полезно для запуска любой программы, которая требует взаимодействия между программой и пользователем. Все, что необходимо, - это то, что взаимодействие можно охарактеризовать программно.

Этот пример отправляет 2 и 4, когда программа запрашивает их:

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'

Использование этого с переменными оболочки требует правильного цитирования и экранирования:

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
0

Один вариант - Elseif все

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

Второй вариант

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

Источник

Поток StackOverflow они имеют больше знаний в пакетном и языке программирования

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .