Предположим, что я хочу выполнить команду ls
десять раз (несмотря на то, что она не имеет смысла, поскольку она будет отображать содержимое каталога только 10 раз), есть ли эквивалент записи следующего:
for (i = 0, i < 10, i++) {
ls
}
Теперь предположим, что я хочу выполнить Java-программу десять раз, каждый раз с другим входным файлом. Есть ли эквивалент написания следующего:
fileList = [input1, input2, ....., input10]
for (i = 0, i < 10, i++) {
java myProgram fileList[i]
}
Я предполагаю, что есть какой-то язык, на котором я мог бы писать такие сценарии. Я пытался искать в Интернете, но мои знания являются базовыми, и я не мог найти ничего, что я понял.
Да существует! Можно использовать 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
Этот язык является самой программой, где Вы связываете команду.
Приглашение командной строки обеспечивается оболочкой. Оболочка 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
(;
эквивалентно новой строке),