Bash Site about Linux


Вернуться к оглавлению

Цикл for в Bash



1. Подстановка значений методом перечисления

for VAR in 1 2 3...N
do
<command on $VAR>
done
или в одну строку:
for VAR in 1 2 3...N; do <command on $VAR>; done

В переменную допускается подставлять как числовые значения, так и ASCII символы.
Пример:
[shonty@~]$ for i in 1 2 A B Abc ; do echo $i; done
1
2
A
B
Abc
Пример перечисления в переменную файлов по "маске" для перекодирования видео:
for i in *.avi; do <mencoder_command on $i>; done


2. Подстановка результатов выполнения другой команды

for VAR in $( <command> ); do <command on $VAR>; done

Пример использования результатов команды seq:
for i in $(seq [КЛЮЧ]); do echo $i; done
[shonty@~]$ for i in $(seq 3); do echo $i; done
1
2
3
[shonty@~]$ for i in $(seq 3 5); do echo $i; done
3
4
5
[shonty@~]$ for i in $(seq 2 2 6); do echo $i; done
2
4
6
Пример использования результатов команды ls:
[shonty@~]$ for i in $(ls /$HOME/Video); do echo $i; done
001.avi
002.avi
003.avi


3. Подстановка используя Си-стиль (C-style)

for (( EXPR1; EXPR2; EXPR3 ))
do
  <список команд>
done
for ((i=1; i<=3 ; i++)); do echo $i; done
[shonty@~]$ for ((i=1; i<=3 ; i++)); do echo $i; done
1
2
3
Подробнее о применении C-style в Bash здесь


4. Перечисление при помощи фигурных скобок {..}

Применение синтаксиса {START..END} поддерживается начиная с bash version 3.0+, а начиная с bash version 4.0+ поддерживается синтаксис {START..END..INCREMENT}:

for VAR in {<start count>..<end count>}
do
<command on $VAR>
done
или
for VAR in {<start count>..<end count>..<increment>}
do
<command on $VAR>
done
Примеры:
[shonty@~]$ for i in {1..3}; do echo $i; done
1
2
3
или
[shonty@~]$ for i in {4..8..2}; do echo $i; done
4
6
8
Отсчёт возможен как на приращение, так и на уменьшение значений:
[shonty@~]$ for i in {6..-4..3}; do echo $i; done
6
3
0
-3


5. Подстановка параметров (in "$@")

Выполняет команды для каждого параметра, который был передан сценарию.
for VAR in $@
do
<command on $VAR>
done
или в одну строку:
for VAR in $@; do <command on $VAR>; done

Так если создать скрипт test.sh
#!/bin/sh
for VAR in $@
do
  echo $VAR
done
то при запуске его с параметрами:
[shonty@~]$ ./test.sh param1 param2 param3
param1
param2
param3
Часть in $@ можно опускать. Тогда скрипт test.sh перепишется:
#!/bin/sh
for VAR
do
  echo $VAR
done

Приведу пару примеров (с in и без):
[shonty@~]$ function FUNC_1 { for VAR in $@; do echo $VAR; done; }
[shonty@~]$ FUNC_1 param1 param2 param3
param1
param2
param3
[shonty@~]$ function FUNC_2 { for VAR; do echo $VAR; done; }
[shonty@~]$ FUNC_2 param1 param2 param3
param1
param2
param3

6. Применение continue и break в цикле for

Для всех вышеперечисленных конструкций возможно использовать команды 'continue' для перехода к следующему элементу цикла или 'break' для выхода из цикла.

Пример (завершить при i=6 и не выполнять при i=3 и i=5):
for i in {1..8}; do
    if [ $i -eq 6 ]; then break; fi
    if [ $i -eq 3 ] || [ $i -eq 5 ]; then continue; fi
    echo $i
done
Результат выполнения:
[shonty@~]$ [shonty@~]$ for i in {1..8}; do \
> if [ $i -eq 6 ]; then break; fi; \
> if [ $i -eq 3 ] || [ $i -eq 5 ]; then continue; fi; \
> echo $i; \
> done
1
2
4


Вернуться к оглавлению







Яндекс.Метрика
ВебСтолица.РУ: создай свой бесплатный сайт!  | Пожаловаться  
Движок: Amiro CMS