Как выполнить команду несколько раз в терминале с / без незначительных изменений?

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

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

     ls

}

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

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

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

     java myProgram fileList[i]

}

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

1
задан 22 June 2014 в 01:45

2 ответа

Да существует! Можно использовать 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

Когда Ваш сценарий растет, скоро станет удобно сохранить его в файл. Запишите свой сценарий (обычно, сценарии удара будут иметь .sh расширение), и выполненный это с:

sh myscript.sh

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

./myscript.sh
3
ответ дан 22 June 2014 в 01:45

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

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

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

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

Элементы синтаксиса я использовал:

  • Присвоение переменной типа массив: variable=(element1 element2 element3) (никакие пробелы вокруг =)
  • Используя переменную типа массив: "${variable[@]}" (да, это странно по историческим причинам),
  • Используя строковую переменную: "$variable"
  • Для цикла: for variable in list; do instructions; done (; эквивалентно новой строке),
2
ответ дан 22 June 2014 в 01:45

Другие вопросы по тегам:

Похожие вопросы: