Как выполнить команду несколько раз в терминале с / без незначительных изменений? - proUbuntu
1 голос
/ 21 июня 2014

Предположим, что я хочу выполнить команду ls десять раз (несмотря на то, что она бесполезна, поскольку она будет отображать только содержимое каталога 10 раз), есть ли эквивалент записи следующего:

for (i = 0, i < 10, i++) {

     ls

}

Теперь предположим, что я хочу выполнить программу на Java десять раз, каждый раз с другим входным файлом. Есть ли эквивалент написания следующего:

fileList = [input1, input2, ....., input10]

for (i = 0, i < 10, i++) {

     java myProgram fileList[i]

}

Я предполагаю, что есть какой-то язык, на котором я мог бы писать подобные сценарии. Я пытался искать в Интернете, но мои знания являются базовыми, и я не мог найти ничего, что я понял.

Ответы [ 2 ]

3 голосов
/ 21 июня 2014

Да, есть! Вы можете использовать BASH, который интерпретирует команды, которые вы вводите в свой терминал.

Например, попробуйте это:

for file in {input1,input2,input3}; do java myprogram $file; done

Этот однострочный простой цикл, который будет запускать myprogram с java в списке файлов.

Это на 100% эквивалентно бегу:

java myprogram input1
java myprogram input2
java myprogram input3

Вы можете использовать этот синтаксис с любой командой, которая вам нравится. Например, вы можете перечислить все файлы в вашем домашнем каталоге с помощью:

for file in ~/*; do echo $file; done

~/* развернется в список всех файлов в каталоге ~ (кроме скрытых файлов).

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

 for i in $(seq 1 100); do java myprogram input$i; done;

$(seq 1 100) расширится до вывода команды seq 1 100, которая предоставляет список чисел от 1 до 100. Таким образом, ваша программа будет работать со всеми 100 файлами "inputN".

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

for i in $(seq 1 10); do
    java myprogram input$i > temp_out
    diff temp_out output$i
done

По мере роста вашего скрипта скоро станет удобно сохранять его в файл. Запишите ваш скрипт (обычно скрипты bash будут иметь расширение .sh) и запустите его с:

sh myscript.sh

или, если вы установите флаг + x в файле myscript, и поместите #!\bin\sh в верхней части вашего скрипта (в котором говорится, что этот файл должен запускаться с bash):

./myscript.sh
2 голосов
/ 22 июня 2014

Этот язык - та самая программа, в которой вы связываете команду.

Командная строка предоставляется оболочкой . Оболочка Ubuntu по умолчанию Bash (вы должны начать с учебников и обратиться к руководству за справкой).

Для последовательного выполнения нескольких связанных команд вы можете использовать loop . Вы можете сохранить список имен файлов в переменной array .

file_list=(input1 input2 … input10)
for file in "${file_list[@]}"; do
  java myProgram "$file"
done

Синтаксические элементы, которые я использовал:

  • Назначение переменной массива: <em>variable</em>=(<em>element1</em> <em>element2</em> <em>element3</em>) (без пробелов вокруг =)
  • Использование переменной массива: "${<em>variable</em>[@]}" (да, это странно по историческим причинам)
  • Использование строковой переменной: "$<em>variable</em>"
  • Для цикла: for <em>variable</em> in <em>list</em>; do <em>instructions</em>; <em>done</em> (; эквивалентно переводу строки)
...