Цикл в Bash очень важная циклическая конструкция в программировании оболочки Bash. В основном цикл в Bash используется для итерации по ряду слов внутри строк. Это пост описывает цикл в Bash со всеми необходимыми примерами.
Базовый синтаксис цикла в Bash:
for { variable name } in { list } do Command1 Command2 . . CommmandN done
Пример цикла в Bash:
1: Простой цикл:
В приведенном ниже примере цикла в Bash мы инициировали переменную i. Эта переменная i в цикле из серии 1 до 5 с помощью приращения значения 1. То же значение переменной я обрабатываю в команде, которая выводит с помощью echo значение переменной i.
[root@destroyer ~]# cat for_loop_test.sh for i in 1 2 3 4 5 do echo "Добро пожаловать на AndreyEx $i раз" done [root@destroyer ~]# chmod u+x for_loop_test.sh [root@destroyer ~]# ./for_loop_test.sh Добро пожаловать на AndreyEx 1 раз Добро пожаловать на AndreyEx 2 раз Добро пожаловать на AndreyEx 3 раз Добро пожаловать на AndreyEx 4 раз Добро пожаловать на AndreyEx 5 раз [root@destroyer ~]#
2. Дополнительный цикл в Bash для версии 4.0:
В приведенном выше примере 1, мы инициировали цикл путем определения и записи всех значений переменной i. Но что, если ваш цикл имеет несколько значений, и вы хотите перебрать то же самое. Bash версии 4.o и выше поддерживает функциональность, в которой вы можете определить начальные и конечные значения серии вместе со значением приращения. Позволяет перебрать от 1 до 12 с приращением значение 3, и вы можете определить его с помощью примера цикла Bash ниже.
[root@destroyer ~]# for i in {0..12..3} > do > echo "Добро пожаловать AndreyEx $i раз" > done Добро пожаловать AndreyEx 0 раз Добро пожаловать AndreyEx 3 раз Добро пожаловать AndreyEx 6 раз Добро пожаловать AndreyEx 9 раз Добро пожаловать AndreyEx 12 раз [root@destroyer ~]#
3. Чтение директории:
Кроме того, можно инициализировать переменный цикл со списком файлов в каталоге с помощью примера ниже.
[root@destroyer var]# for i in $( ls ) do echo File: $i; done
Образец вывода цикла в Bash, показано ниже:
File: account File: cache File: crash File: cvs File: data File: db File: ftp File: ftp_account File: game File: lib File: locale File: locks File: log File: mailru File: nis File: opt File: preserve File: runs File: spools File: temp File: yp [root@destroyer var]#
4. Синтаксис программирования на C:
Вы можете также использовать цикл в Bash с использованием языка программирования C, как заявление, как показано ниже:
for ((i=1;i<=20;i=i+1)) do echo $i done
5. Содержание обработки файла.
Вы можете также использовать цикл в Bash при обработке содержимого файла в другой команде. Это очень помогает при обработке огромного количества данных. Если у вас есть файл со списком пользователей и вы хотите проверить, являются ли они заблокированными или нет. То используйте пример ниже.
Пример файла со списком пользователей.
[root@destroyer ~]# cat /tmp/users boris andreyex marina test_ftp_user testuser uxuser
В приведенном ниже примере переменная «i» инициализируется с помощью команды cat и передается команде «passwd -s», имеющий аргумент как $i, который не что иное, как имя пользователя, чтобы проверить, заблокирован он или нет.
[root@destroyer ~]# for i in `cat /tmp/users` > do > passwd -S $i > done boris LK 2017-01-13 0 99999 7 -1 (Password locked.) andreyex LK 2017-01-01 0 99999 7 -1 (Password locked.) marina LK 2017-01-01 0 99999 7 -1 (Password locked.) test_ftp_user PS 2017-01-07 0 99999 7 -1 (Password set, SHA512 crypt.) testuser PS 2017-01-01 0 99999 7 -1 (Password set, SHA512 crypt.) uxuser LK 2017-01-08 0 99999 7 -1 (Password locked.) [root@destroyer ~]#
6. Копирование файлов на несколько хостов
Вы можете также использовать цикл в Bash, где вы можете скопировать файлы на несколько хостов, и вы не хотите вводить ту же самую команду одну за другой. В приведенном ниже примере вы скопируете файл test.txt на хосты: «ANDREYEX01 andreyex02 manns1 andreyex06», также вы можете с помощью цикла в Bash позволить скопировать файл на одном дыхании.
for HOST in ANDREYEX01 andreyex02 manns1 andreyex06 do scp test.txt $HOST:/tmp/ done
7. LVM зеркалирование:
Вы можете использовать цикл в Bash в зеркальном отображении логического расширения LV. Предположим, вы имеете группу томов vg00 с 10 LV, и вы хотите отразить его с помощью PV sde1. Затем вы можете использовать цикл для ее выполнения в простом компактном решении на одном дыхании.
for i in 1 2 3 4 5 6 7 8 9 10 do lvextend -m 1 /dev/vg00/lvol$i /dev/sde1 done
8. Таблица умножения:
Допустим, вы хотите написать программу с помощью оболочки Bash для таблицы умножения В приведенном ниже примере цикла, мы инициализируем переменную i, которая будет использоваться для умножения цифры с помощью команды expr.
if [ $# -eq 0 ] then echo "Пожалуйста введите число неравное 0" echo "Синтаксис : $0 числа" exit 1 fi n=$1 for i in 1 2 3 4 5 6 7 8 9 10 do echo "$n * $i = `expr $i \* $n`" done
Пример вывода:
[root@destroyer ~]# ./myfile.sh 7 7 * 1 = 7 7 * 2 = 14 7 * 3 = 21 7 * 4 = 28 7 * 5 = 35 7 * 6 = 42 7 * 7 = 49 7 * 8 = 56 7 * 9 = 63 7 * 10 = 70