Я шукаю основний цикл, такий як:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
але для баш.
Я шукаю основний цикл, такий як:
for(int i = 0; i < MAX; i++) {
doSomething(i);
}
але для баш.
Відповіді:
З цього сайту :
for i in $(seq 1 10);
do
echo $i
done
for ((i = 0 ; i < max ; i++ )); do echo "$i"; done
ArrayLength=${#array[@]}
як ми її тут використовуємо замість max
?
Баш for
складається із змінної (ітератора) та списку слів, де ітератор буде, ну, повторювати.
Отже, якщо у вас обмежений перелік слів, просто вкажіть їх у наступному синтаксисі:
for w in word1 word2 word3
do
doSomething($w)
done
Ймовірно, ви хочете повторити кілька чисел, тому ви можете скористатися seq
командою, щоб створити для вас список чисел: (наприклад, від 1 до 100)
seq 1 100
і використовувати його в циклі FOR:
for n in $(seq 1 100)
do
doSomething($n)
done
Зверніть увагу на $(...)
синтаксис. Це поведінка bash, вона дозволяє передавати вихідні дані однієї команди (у нашому випадку з seq
) іншій (the for
)
Це дуже корисно, коли вам доведеться переглядати всі каталоги на якомусь шляху, наприклад:
for d in $(find $somepath -type d)
do
doSomething($d)
done
Можливості створення списків нескінченні.
Bash 3.0+ може використовувати такий синтаксис:
for i in {1..10} ; do ... ; done
..котрий дозволяє уникнути появи зовнішньої програми для розширення послідовності (наприклад seq 1 10
).
Звичайно, це має ту ж проблему, що і for(())
рішення, пов’язане з bash і навіть певною версією (якщо це для вас важливо).
Спробуйте bash
вбудовану допомогу:
$ help for
for: for NAME [in WORDS ... ;] do COMMANDS; done
The `for' loop executes a sequence of commands for each member in a
list of items. If `in WORDS ...;' is not present, then `in "$@"' is
assumed. For each element in WORDS, NAME is set to that element, and
the COMMANDS are executed.
for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done
Equivalent to
(( EXP1 ))
while (( EXP2 )); do
COMMANDS
(( EXP3 ))
done
EXP1, EXP2, and EXP3 are arithmetic expressions. If any expression is
omitted, it behaves as if it evaluates to 1.
#! /bin/bash
function do_something {
echo value=${1}
}
MAX=4
for (( i=0; i<MAX; i++ )) ; {
do_something ${i}
}
Ось приклад, який також може працювати у старих оболонках, але при цьому залишається ефективним для великих відліків:
Z=$(date) awk 'BEGIN { for ( i=0; i<4; i++ ) { print i,"hello",ENVIRON["Z"]; } }'
Але удачі в корисних справах всередині awk
: Як я використовую змінні оболонки в сценарії awk?
do
/ done
пари.
Я зазвичай люблю використовувати невеликий варіант стандартного циклу for. Я часто використовую це для запуску команди на ряд віддалених хостів. Я використовую перевагу розширення фігурних дужок bash для створення циклів, які дозволяють мені створювати нечислові цикли for-loop.
Приклад:
Я хочу запустити команду uptime на хостах frontend 1-5 та вхідних хостів 1-3:
% for host in {frontend{1..5},backend{1..3}}.mycompany.com
do ssh $host "echo -n $host; uptime"
done
Зазвичай я запускаю це як однорядкову команду з крапкою з комою на кінцях рядків замість більш читабельної версії вище. Основне врахування використання полягає в тому, що дужки дозволяють задавати декілька значень, які потрібно вставити в рядок (наприклад, до {foo, bar} публікація результатів у префопості, пребарпоста) та дозволяють рахувати / послідовності, використовуючи подвійні періоди (можна використовувати a. .z тощо). Однак синтаксис подвійного періоду - нова особливість bash 3.0; попередні версії цього не підтримуватимуть.
якщо вас цікавить лише bash, найкраще представлене вище рішення "for ((...))", але якщо ви хочете щось сумісне з POSIX SH, що працюватиме на всіх UNIX, вам доведеться використовувати "expr" та "while", і це тому, що "(())" або "seq" або "i = i + 1" не є таким портативним серед різних оболонок
Я весь час використовую варіанти цього для обробки файлів ...
для файлів у * .log; do echo "Роби речі з: $ файлами"; echo "Зробити більше речей з: $ файлами"; зроблено;
Якщо вас цікавить обробка списків файлів, зверніться до опції -execdir для файлів .