Существует ли стандартный инструмент UNIX для повторения команды любое количество раз?


11

Это, вероятно, очень просто, но есть ли простой способ написать команду один раз в консоли, и есть ли у нее nвремя выполнения , где nуказано во время выполнения? Что-то вроде этого:

repeat 100 echo hello

Существует ли такая команда (предположим, типичная установка Linux)?

Или я бы написал, чтобы сделать какой-то цикл в Bash?

Ответы:


20

Да, это возможно. Bash имеет очень обширный язык сценариев. В этом случае:

for i in {1..100}; do echo 'hello'; done

Дополнительные циклические примеры: http://www.cyberciti.biz/faq/bash-for-loop/
Полная ссылка на bash: http://www.gnu.org/software/bash/manual/bashref.html


что происходит, когда команда не выполняется?
Маацца

Ваша обработка ошибок ловит это и выясняет, что делать вместо этого.
Xyon

3

Или я бы написал, чтобы сделать какой-то цикл в Bash?

Да, вы бы, как это:

for(( i = 0; i < 100; i++ )); do echo "hello"; done

или короче:

for((i=100;i--;)); do echo "hello"; done

а затем поместите этот материал в функцию и вуаля, у вас есть команда: repeat () {for_stuff_here; делать "$ @"; готово}
Акира

3

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

# gnu coreutils provides seq
for i in $(seq 1 100) ; do printf "hello\n" ; done

# freebsd (and probably other bsd) provides jot
for i in $(jot - 1 100) ; do printf "hello\n" ; done

2

Я не нашел «стандартного» инструмента Linux для этой работы, но я обычно сохраняю свои точечные файлы (.bashrc, .vimrc и т. Д.) От установки к установке, поэтому следующее, если смотреть на перспективы сохранения ваших точечных файлов в новых установках:

В конце вашего .bashrc или .bash_aliases поместите следующее определение:

repeat() {
  n=$1    #gets the number of times the succeeding command needs to be executed
  shift   #now $@ has the command that needs to be executed
  while [ $(( n -= 1 )) -ge 0 ]    #loop n times;
  do
    "$@"    #execute the command; you can also add error handling here or parallelize the commands
  done
}

Сохраните файл и либо снова откройте оболочку, либо выполните source /path/to/.bashrcили source /path/to/.bash_aliases, в зависимости от того, что вы решите изменить, в существующей оболочке.

Это оно! Вы должны быть в состоянии использовать его следующим образом:

repeat 100 echo hello

repeat 84 ~/scripts/potato.sh

и т.п.


отлично. было бы хорошо поставить «local» перед n = $ 1, чтобы избежать загрязнения пространства имен глобальной переменной
Don Hatch

1

Синтаксис цикла for глупый. Это короче:

seq 10|xargs -I INDEX echo "print this 10 times"

0

В настоящее время ни один из других ответов не использует стандартные инструменты Unix, что и требует заглавный вопрос.

Все они используют либо нестандартные команды ( seqили jot), либо расширения оболочки (расширение в стиле C forили фигурные скобки), то есть все они не соответствуют стандарту POSIX.

Вот переносимый способ, который должен работать с любой POSIX-совместимой оболочкой и операционной системой:

for i in $(awk 'BEGIN {for(i=0;i<100;i++) print i}'); do echo hello; done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.