Чи є стандартний інструмент UNIX для повторення команди будь-яку кількість разів?


13

Це, мабуть, мертве легко, але чи є простий спосіб написати команду один раз у консолі, і чи виконується вона nчасом, де nвказано під час виконання? Щось на зразок цього:

repeat 100 echo hello

Чи існує така команда (припустимо типову установку Linux)?

Або я б написав, щоб зробити якусь петлю в баші?

Відповіді:


23

Так, це можливо. Bash має дуже широку мову сценаріїв. В цьому випадку:

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

Більше прикладів циклу: http://www.cyberciti.biz/faq/bash-for-loop/
Повна посилання на баш: http://www.gnu.org/software/bash/manual/bashref.html


що відбувається, коли команда не працює?
maazza

Ваша обробка помилок виявляє це і розробляє, що робити замість цього.
Xyon

Я намагався for i in {1..100}; do python3 foo.py ; doneфактично мати на увазі отримати час виконання (щоб побачити, як швидко), time for i in {1..100}; do python3 foo.py ; doneі тоді CTRL-C не зможе зупинити цикл
nonopolarity

3

Або я б написав, щоб зробити якусь петлю в баші?

Так, ви хотіли б цього:

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

або, коротше:

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

а потім укладіть цей матеріал у функцію та вуаля, у вас є ваша команда: повторити () {for_stuff_here; робити "$ @"; зроблено}
akira

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

тощо.


приємно. було б добре поставити "локальний" перед n = $ 1, щоб уникнути забруднення глобальної простори змінних просторів імен
Дон Хетч

0

В даний час жоден з інших відповідей не використовує стандартні інструменти Unix, про що і задається заголовок.

Всі вони використовують або нестандартні команди ( seqабо jot), або розширення оболонки ( forцикл у стилі C або розширення дужки), тобто всі вони не відповідають стандарту 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.