11

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

repeat 100 echo hello

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

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

6 ответов6

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

3

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

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

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

или короче:

for((i=100;i--;)); do echo "hello"; done
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

и т.п.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .