Я иногда запускаю командную строку bash следующим образом:
n=0; while [[ $n -lt 10 ]]; do some_command; n=$((n+1)); done
Запускать some_command
несколько раз подряд - 10 раз в этом случае.
Часто some_command
это действительно цепочка команд или конвейер.
Есть ли более краткий способ сделать это?
let ++n
вместоn=$((n+1))
(на 3 символа меньше).zsh
имеетrepeat 10 do some_command; done
.sh: 1: [[: not found
.Ответы:
Или в качестве одной строки для тех, кто хочет легко копировать и вставлять:
источник
for (n=0;n<k;n++))
может быть лучше; Я подозреваю,{1..k}
что материализует строку со всеми этими целыми числами, разделенными пробелами.n=15;for i in $(seq -f "%02g" ${n});do echo $i; done 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
Используя константу:
Использование переменной (может включать математические выражения):
источник
x=10
for ((n=0; n < $x; n++));
for run in {1..10}; do echo "on run $run"; done
n
уже установлено определенное значение?for (( ; n<10; n++ ))
не работает / редактировать: лучше всего , вероятно , использовать один из других ответов , какwhile (( n++...
одинЕще один простой способ взломать его:
запустить эхо 20 раз.
Обратите внимание, что
seq 20 | xargs -Iz echo "Hi there z"
будет вывод:источник
seq 20
)seq 20 | xargs -I{} echo "Hi there {}"
z
это не очень хороший заполнитель, потому что он настолько распространен, что может быть обычным текстом в тексте команды. Использование{}
будет лучше.seq
? так что бы просто напечататьHi there
20 раз (без номера)? РЕДАКТИРОВАТЬ: просто использовать,-I{}
а затем не иметь{}
в командеIIIII
тогда это выглядит хорошо, например:seq 20 | xargs -IIIIII timeout 10 yourCommandThatHangs
Если вы используете оболочку zsh:
Где 10 - количество повторений команды.
источник
repeat 10 { !! }
Используя GNU Parallel вы можете сделать:
Если вы не хотите указывать число в качестве аргумента и запускаете только одно задание за раз:
Посмотрите вступительное видео для быстрого ознакомления: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Просмотрите учебник ( http://www.gnu.org/software/parallel/parallel_tutorial.html ). Ты командная строка с любовью тебя за это.
источник
-j1 -N0
которые отключают параллелизм ????some_command
1000 раз в сериале без аргументов? И: Вы можете выразить это корочеparallel -j1 -N0 some_command ::: {1..1000}
?repeat.sh repeatcount some_command
. Для реализации в сценарии оболочки я мог бы использоватьparallel
, если он уже был установлен на машине (вероятно, не будет). Или я мог бы тяготеть к xargs, поскольку это происходит быстрее всего, когда перенаправление не требуетсяsome_command
.parallel -N0 -j1 --retries 4 --results outputdir/ some_command
Простая функция в конфигурационном файле bash (
~/.bashrc
часто) может работать хорошо.Назови это так.
источник
do ${*:2}
я добавил eval,do eval ${*:2}
чтобы убедиться, что он будет работать для запуска команд, которые не запускаются с исполняемых файлов. Например, если вы хотите установить переменную окружения перед выполнением такой команды, какSOME_ENV=test echo 'test'
.xargs
это быстро :На современном 64-битном Linux дает:
Это имеет смысл, так как
xargs
команда один собственный процесс , который порождает/usr/bin/true
команд множественного времени, вместо того , чтобыfor
иwhile
петля, которые все интерпретируемую в Bash. Конечно, это работает только для одной команды; если вам нужно выполнить несколько команд в каждой итерации цикла, он будет таким же быстрым или, возможно, быстрее, чем передачаsh -c 'command1; command2; ...'
в xargs-P1
Также может быть изменен, скажем,-P8
на нерест 8 процессов параллельно , чтобы получить еще один большой прирост в скорости.Я не знаю, почему параллель GNU такая медленная. Я бы подумал, что это будет сопоставимо с XARGS.
источник
Другая форма вашего примера:
источник
Например, вы можете заключить его в функцию:
Назовите это как:
источник
tr
Здесь вводит в заблуждение , и он работает на выходеmanytimes
, а неecho
. Я думаю, вы должны удалить его из образца.xargs и seq помогут
вид :
источник
Обратите внимание на подчеркивание вместо использования переменной.
источник
_
это имя переменной.Если вы делаете это периодически, вы можете запустить следующую команду, чтобы запускать ее каждую 1 секунду в течение неопределенного времени. Вы можете установить другие пользовательские проверки для запуска n раз.
watch -n 1 some_command
Если вы хотите получить визуальное подтверждение изменений, добавьте
--differences
передls
командой.Согласно справочной странице OSX, есть также
Справочную страницу по Linux / Unix можно найти здесь
источник
Я решил с помощью этого цикла, где повтор является целым числом, которое представляет номер цикла
источник
Еще один ответ: используйте расширение параметров для пустых параметров:
Протестировано на Centos 7 и MacOS.
источник
Кажется, что все существующие ответы требуют
bash
и не работают со стандартным BSD UNIX/bin/sh
(например,ksh
в OpenBSD ).Приведенный ниже код должен работать на любом BSD:
источник
Немного наивно, но это то, что я обычно вспоминаю на макушке:
Очень похоже на ответ @ Джо-Коберга. Его лучше, особенно если вам нужно много повторений, мне сложнее запомнить другой синтаксис, потому что в последние годы я не
bash
очень часто его использую . Я имею в виду не для сценариев по крайней мере.источник
Файл скрипта
и выход ниже
источник
Как насчет альтернативной формы,
for
упомянутой в (bashref) Looping Constructs ?источник
Для циклов, вероятно, правильный способ сделать это, но вот забавная альтернатива:
echo -e {1..10}"\n" |xargs -n1 some_command
Если вам нужен номер итерации в качестве параметра для вашего вызова, используйте:
echo -e {1..10}"\n" |xargs -I@ echo now I am running iteration @
Редактировать: было справедливо отмечено, что приведенное выше решение будет работать гладко только с простыми командами (без конвейеров и т. Д.). Вы всегда можете использовать
sh -c
более сложные вещи, но это того не стоит.Другой метод, который я обычно использую, это следующая функция:
rep() { s=$1;shift;e=$1;shift; for x in `seq $s $e`; do c=${@//@/$x};sh -c "$c"; done;}
теперь вы можете назвать это как:
rep 3 10 echo iteration @
Первые два числа дают диапазон.
@
Будет переводятся на номер итерации. Теперь вы можете использовать это и с трубами:rep 1 10 "ls R@/|wc -l"
с дать вам количество файлов в каталогах R1 .. R10.
источник
rep 1 2 touch "foo @"
не будет создавать два файла "foo 1" и "foo 2"; скорее он создает три файла "foo", "1" и "2". Может быть способ получить правильное цитирование с помощьюprintf
и%q
, но будет сложно получить произвольную последовательность слов, правильно заключенную в кавычки, в одну строку для передачиsh -c
.rep
в своем.bashrc
, дальнейшие вызовы станут намного более краткими.