1

Предположим, у меня есть терминальная команда с именем foo (на самом деле это будет что-то вроде cd или ls или что-то более сложное. Есть ли способ, которым я могу выполнить эту команду много раз БЕЗ использования сценария.

Например, я хочу сделать эквивалент следующего:

foo && foo && foo && foo && foo

Есть ли способ, которым я могу сделать что-то вроде

foo * 5 

или, может быть

5:foo

Я использую машину Linux.

5 ответов5

1

Добавьте небольшую запятую в ответ блоггера, чтобы сделать его однострочным:

for variables in {1 2 3 4 5};  do ls; done
1

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

echo -n; for i in {1..5}; do if [[ $? ]]; then foo; fi; done

"$?"возвращает состояние предыдущего вызова функции; поскольку мы сначала вызываем" echo ", первой итерацией цикла будет" true "(0 в bash.)," fi "закрывает оператор" if ", и точки с запятой необходимы.

вот то же самое, если вы писали bash-скрипт:

#!/ Бен / Баш
эхо-н
для меня в {1..5}; делать
если [[$? ]]; затем
Foo
фи
сделанный

вы заметите, что после foo нет точки с запятой; при написании полноценного bash-скрипта в среде, где доступны разрывы строк (например, ваш любимый текстовый редактор,) разрывы строк делают то же самое, что и точки с запятой :)

также обратите внимание, что вы могли бы вместо этого использовать

[[ $? ]] && foo

вместо оператора if; понимать, что && означает, что foo будет выполняться только в том случае, если в предыдущем foo не было ошибки. т.е. в вызове функции

thing1 && thing2

thing2 будет выполняться, только если thing1 работает нормально (технически, если он возвращает значение 0), чтобы игнорировать, работает ли foo или нет, используйте точки с запятой вместо &&

1

Вы можете попробовать что-то вроде:

for i in {1..10}; do YourCommand; done

Пример:

for i in {1..5}; do ls -l; done

0

Вы пробовали использовать цикл for?

for VARIABLE in 1 2 3 4 5 .. N
do
    command1
    command2
    commandN
done
0

Я нашел отличный метод здесь.

Я знаю, что это все еще "своего рода сценарий", но я думаю, что это самый близкий вы можете получить, не набирая командную строку целиком.

Вы можете создать команду repeat с помощью которой вы можете сделать это:

 repeat 5 ./foo

Добавьте следующие строки в конец вашего ~/.bashrc (если вы используете bash):

repeat() {
    n=$1
    shift
    while [ $(( n -= 1 )) -ge 0 ]
    do
        "$@"
    done
}

и в следующий раз, когда вы войдете (или запустите bash), вы можете использовать repeat 5 ./foo .

Btw. repeat - это уже ключевое слово (которое делает то же самое) в csh, tcsh и zsh, поэтому с этим дополнением вы добавите его в bash и оно будет работать точно так же.

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