Выполнение программы с различными параметрами (цикл)

Попробовать info coreutils 'who invocation':

`-u'
     After the login time, print the number of hours and minutes that
     the user has been idle.  `.' means the user was active in the last
     minute.  `old' means the user has been idle for more than 24 hours.

информационная документация инструментов GNU обычно - намного больше завершенное, чем страницы справочника.

3
14.08.2013, 01:50
3 ответа

Можно использовать простое для цикла с Bash, Zsh или Ksh93. Следующие работы только начиная с версии 4 (2009) Bash, zsh 4.3.10 (2010) и ksh93r (2006) (хотя {x..y} синтаксис, порожденный в zsh2.6-beta4 в 1995)).

#!/bin/bash
# since Bash v4
for i in {10..100..10}
do
     $path_of_prog/prog $i
done

{$start..$end..$step} часть говорит это $i в запуске, равном $start и $i перейдет в $end. $step сумма с который $i будет увеличен каждый шаг. Таким образом, мы получаем значения 10 20 30 ... 100 для $i.

Вы могли также записать все это в одной строке с

for i in {10..100..10}; do ./prog $i; done

Если у Вас есть более старый Bash и GNU seq доступно, используйте следующие строки

#!/bin/bash
#only for pre Bash v4
for i in $(seq 10 10 100)
do
   $path_of_prog/prog $i
done

или как один лайнер

for i in $(seq 10 10 100);do ./prog $i; done

(вышеупомянутое предполагает, что Вы не изменили $IFS переменная).

6
27.01.2020, 21:09

Вопрос отмечен bash, это только в пользу пользователей других оболочек.

В POSIX sh сценарий (для мобильности):

i=10
while [ "$i" -le 100 ]; do
  ./prog "$i"
  i=$(($i+10))
done

В Границе sh сценарий (для совместимости к системам пред90-х):

echo '0[10+pd100>x]dsxx' | dc | xargs -n 1 ./prog

В zsh (для людей, не вынужденных использовать bash):

i=0; repeat 10 ./prog $((i+=10))

Или

for i ({1..10}0) ./prog $i

или:

for ((i=10;i<=100;i+=10)) ./prog $i

или:

zargs -n1 {1..10}0 -- ./prog
6
27.01.2020, 21:09

Есть много способов заставить printf делать это за вас, но вот лишь пара:

printf ' ./prog %d0\n' 1 2 3 | sh

Или, может быть, вы хотите, чтобы программа действительно запускалась 30 раз. seq uence и printf очень хорошо подходят для этой цели:

printf ' ./prog %d\n'  `seq 1 30` | sh

Или, может быть, результаты вашей команды включают какое-то значение переменной, которым вы не хотите жертвовать. дальняя сторона трубы. Хорошо.: [

. <<CMD /dev/fd/0
    $(printf './prog %d0\n' 1 2 3 )
CMD

] Возможно, вам не нужны числа, но вам нужно столько копий строки, или, может быть, нужно повторить только часть команды, но другие части статичны:

 . <<CMD /dev/fd/0
    $( { printf 'echo "this is part 1" >&2| ' ;\
    printf 'echo "these are parts %d" >&2 | ' `seq 1 5` ; })
CMD

printf 'this string is repeated for each of printfs args, 
    but the args are not included%.0b\n' `seq 1 5`
-1
27.01.2020, 21:09

Теги

Похожие вопросы