Предположим, у меня есть терминальная команда, называемая foo
(на самом деле это было бы что-то вроде cd
или ls
или что-то более сложное). Есть ли способ, которым я могу выполнить эту команду много раз БЕЗ использования скрипта.
Например, я хочу сделать что-то похожее на следующее:
foo && foo && foo && foo && foo
Есть ли способ, которым я могу сделать что-то в этом роде?
foo * 5
или, может быть
5:foo
Я использую машину с Linux.
решение1
Добавьте несколько запятых в ответ блогера, чтобы сделать его однострочным:
for variables in {1 2 3 4 5}; do ls; done
решение2
Blogger прав. Однако важно точно соблюдать синтаксис: если вы используете интерактивную оболочку (например, терминал)
echo -n; for i in {1..5}; do if [[ $? ]]; then foo; fi; done
«$?» возвращает статус предыдущего вызова функции; поскольку мы сначала вызываем «echo», первая итерация цикла будет «true» (0 в bash). «fi» закрывает оператор «if», и точки с запятой необходимы.
Вот то же самое, если бы вы писали bash-скрипт:
#!/bin/bash
echo -n
for i in {1..5}; do
if [[ $? ]]; then
foo
fi
done
вы заметите, что после foo не стоит точка с запятой; при написании полноценного bash-скрипта в среде, где доступны переносы строк (например, в вашем любимом текстовом редакторе), переносы строк выполняют ту же функцию, что и точки с запятой :)
также обратите внимание, что вместо этого вы могли бы использовать
[[ $? ]] && foo
вместо оператора if; поймите, что && означает, что foo будет выполнен только в том случае, если предыдущий foo не содержал ошибки. т.е. в вызове функции
thing1 && thing2
thing2 будет выполнен только в том случае, если thing1 работает нормально (технически, если он возвращает значение 0), чтобы игнорировать, работает foo или нет, используйте точку с запятой вместо &&
решение3
Вы можете попробовать что-то вроде:
for i in {1..10}; do YourCommand; done
Пример:
for i in {1..5}; do ls -l; done
решение4
Я нашел отличный методздесь.
Я знаю, что это все еще «своего рода скрипт», но я думаю, что это самое близкое, что можно получить, не набирая целую командную строку с командами.
Вы можете создать команду, repeat
с помощью которой это можно сделать:
repeat 5 ./foo
Добавьте следующие строки в конец вашего файла ~/.bashrc
(если вы используете bash):
repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
"$@"
done
}
и в следующий раз, когда вы войдете в систему (или запустите bash), вы сможете использовать repeat 5 ./foo
.
Кстати, repeat
это уже ключевое слово (которое делает то же самое) в csh, tcsh и zsh, так что с этим дополнением вы добавите его, bash
и оно будет работать точно так же.