Разное

Циклы в bash: циклы / Блог компании RUVDS.com / Хабр

Содержание

Практическое руководство: Bash цикл с примерами

Цикл Bash очень важная циклическая конструкция в программировании оболочки Bash. В основном цикл в Bash используется для итерации по ряду слов в пределах строк. В статье описывается цикл в Bash со всеми необходимыми примерами.

Базовый синтаксис “Bash для цикла”:

for { variable name } in { list }
 
do
 
Command1
 
Command2
 
.
 
.
 
CommmandN
 
done

 

Примеры Bash для Loop:

1:   Простой цикл:

В приведенном ниже примере для цикла мы инициировали переменную. Эта переменная зациклена от 1 до 5 с помощью приращения значения 1. То же значение переменной обрабатывается в команде, которая передается в echo значение переменной.

[[email protected] ~]# cat for_loop_test.sh
for i in 1 2 3 4 5
do
echo "Welcome to AndreyEx $i times"
done
[[email protected] ~]# chmod u+x for_loop_test.sh
[[email protected] ~]# ./for_loop_test.sh
Welcome to AndreyEx 1 times
Welcome to AndreyEx 2 times
Welcome to AndreyEx 3 times
Welcome to AndreyEx 4 times
Welcome to AndreyEx 5 times
[[email protected] ~]#

 

2. Дополнительный цикл Bash для версии 4.0:

В приведенном выше примере 1 мы инициировали цикл путем записи всех значений переменной, Но что, если ваш цикл имеет несколько значений, и вы хотите перебрать то же самое. В Bash версии 4.o и выше, поддержка функциональности, в которой вы можете определить начальные и конечные значения серии наряду со значением приращения. Позволяет перебрать от 1 до 20 с шагом до 4 значений, вы можете определить, используя ниже пример для цикла.

[[email protected] ~]# for i in {0..20..4}
> do
> echo "Welcome to AndreyEx $i times"
> done
Welcome to AndreyEx 0 times
Welcome to AndreyEx 4 times
Welcome to AndreyEx 8 times
Welcome to AndreyEx 12 times
Welcome to AndreyEx 16 times
Welcome to AndreyEx 20 times
[[email protected] ~]#

 

3. Чтение каталога:

Кроме того, можно инициализировать Bash для переменной цикла со списком файлов в каталоге с помощью примера ниже.

[[email protected] var]# for i in $( ls )
do
echo File: $i;
done

 

Пример вывода Bash для цикла, показан ниже:

	
File: account
File: cache
File: crash
File: cvs
File: db
File: empty
File: ftp
File: ftp_dump
File: games
File: lib
File: local
File: lock
File: log
File: mail
File: nis
File: opt
File: preserve
File: run
File: spool
File: tmp
File: yp
[[email protected] var]#

 

4. Программирование как синтаксис С:

Вы можете также использовать Bash цикл с использованием программирования C, как показано ниже:

for ((i=1;i<=25;i=i+1))
do
echo $i
done

 

5. Обработка содержания файла.

Вы можете также использовать цикл в Bash при обработке содержимого файла в другой команде. Это очень помогает при обработке огромного количества данных. Допустим, у вас есть файл со списком пользователей и вы хотите, проверить, являются ли они заперты или нет. Используйте ниже Bash , например.

Пример файла со списком пользователей.

[[email protected] ~]# cat /tmp/users
mann
foo
bar
test_ftp_user
testuser
uxuser

 

В приведенном ниже примере переменная инициализируется с помощью команды cat и передается в команду “passwd -s”, имеющий аргумент как $, который не что иное, как имя пользователя, чтобы проверить заблокирован он или нет.

[[email protected] ~]# for i in `cat /tmp/users`
> do
> passwd -S $i
> done
mann LK 2017-01-13 0 99999 7 -1 (Password locked.)
foo LK 2017-01-01 0 99999 7 -1 (Password locked.)
bar 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.)
[[email protected] ~]#

 

6. Копирование файлов на количество хостов

Вы можете также использовать Баш для цикла, где вы хотите скопировать файлы по количеству хостов, и вы не хотите вводить ту же команду один за другим. В приведенном ниже примере вы хотите скопировать файл test.txt в файл на хосте “RHEL01 rhel02 mann1 rhel06”, то вы можете пользователю цикл, который позволит вам копировать файл на одном дыхании.

7. Зеркалирование LVM:

Вы можете использовать цикл в зеркальном отображении логического расширения 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 для таблицы умножения. Используйте ниже Bash для цикла. В приведенном ниже примере Bash для контура мы инициализируем переменную, который будете использовать для умножения цифры с помощью команды expr.

if [ $# -eq 0 ]
then
echo "Please do not enter Zero"
echo "Syntax : $0 number"
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

 

Пример вывода:

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Практическое руководство: Цикл в Bash с примерами

Цикл в 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.

	
[[email protected] ~]# cat for_loop_test.sh
for i in 1 2 3 4 5
do
echo "Добро пожаловать на AndreyEx $i раз"
done
[[email protected] ~]# chmod u+x for_loop_test.sh
[[email protected] ~]# ./for_loop_test.sh
Добро пожаловать на AndreyEx 1 раз
Добро пожаловать на AndreyEx 2 раз
Добро пожаловать на AndreyEx 3 раз
Добро пожаловать на AndreyEx 4 раз
Добро пожаловать на AndreyEx 5 раз
[[email protected] ~]#

 

2.   Дополнительный цикл в Bash для версии 4.0:

В приведенном выше примере 1, мы инициировали цикл путем определения и записи всех значений переменной i. Но что, если ваш цикл имеет несколько значений, и вы хотите перебрать то же самое. Bash версии 4.o и выше поддерживает функциональность, в которой вы можете определить начальные и конечные значения серии вместе со значением приращения. Позволяет перебрать от 1 до 12 с приращением значение 3, и вы можете определить его с помощью примера цикла Bash ниже.

	
[[email protected] ~]# for i in {0..12..3}
> do
> echo "Добро пожаловать AndreyEx $i раз"
> done
Добро пожаловать AndreyEx 0 раз
Добро пожаловать AndreyEx 3 раз
Добро пожаловать AndreyEx 6 раз
Добро пожаловать AndreyEx 9 раз
Добро пожаловать AndreyEx 12 раз
[[email protected] ~]#

 

3. Чтение директории:

Кроме того, можно инициализировать переменный цикл со списком файлов в каталоге с помощью примера ниже.

[[email protected] 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
[[email protected] var]#

 

4. Синтаксис программирования на C:

Вы можете также использовать цикл в Bash с использованием языка программирования C, как заявление, как показано ниже:

for ((i=1;i<=20;i=i+1))
do
echo $i
done

 

5. Содержание обработки файла.

Вы можете также использовать цикл в Bash при обработке содержимого файла в другой команде. Это очень помогает при обработке огромного количества данных. Если у вас есть файл со списком пользователей и вы хотите проверить, являются ли они заблокированными или нет. То используйте пример ниже.

Пример файла со списком пользователей.

[[email protected] ~]# cat /tmp/users
boris
andreyex
marina
test_ftp_user
testuser
uxuser

 

В приведенном ниже примере переменная «i»  инициализируется с помощью команды cat и передается команде «passwd -s», имеющий аргумент как $i, который не что иное, как имя пользователя, чтобы проверить, заблокирован он или нет.

[[email protected] ~]# 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.)
[[email protected] ~]#

 

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

 

Пример вывода:

[[email protected] ~]# ./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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Циклы Bash » Tapen.ru — Про свободное программное обеспечение

В этой статье мы продолжим наш цикл про написание скриптов на Bash. Мы уже рассмотрели как работать с архивами и создавать функции, но этого еще недостаточно. Любой уважающий себя язык программирования должен содержать циклы. Цикл — это такая последовательность, которая позволяет выполнять определенный участок кода необходимое количество раз.

С помощью циклов вы можете очень сильно сократить количество строк кода, которые необходимо написать для однотипных операций. В этой статье мы рассмотрим что такое циклы Bash, как их создавать и использовать.

Циклы Bash

Как я уже сказал, циклы позволяют выполнять один и тот же участок кода необходимое количество раз. В большинстве языков программирования существует несколько типов циклов. Большинство из них поддерживаются оболочкой Bash. Мы рассмотрим их все в сегодняшней статье, но сначала поговорим какими они бывают:

  • for — позволяет перебрать все элементы из массива или использует переменную-счетчик для определения количества повторений;
  • while — цикл выполняется пока условие истинно;
  • until — цикл выполняется пока условие ложно.

Циклы Bash, это очень полезная вещь и разобраться с ними будет несложно. Bash позволяет использовать циклы как в скриптах, так и непосредственно в командной оболочке. Дальше мы рассмотрим каждый из этих видов циклов.

Цикл for

Цикл for bash применяется очень часто из-за своей специфики. Его проще всего использовать когда вы знаете сколько раз нужно повторить операцию или вам нужно просто обработать по очереди все элементы массива и вы не хотите контролировать количество повторений.

Цикл for имеет несколько синтаксисов и может вести себя по разному. Для перебора элементов списка удобно использовать такой синтаксис:

for переменная in список

do

команда1

команда2

done

Каждый цикл for независимо от типа начинается с ключевого слова for. Дальше все зависит от типа. В этом случае после for указывается имя переменной, в которую будет сохранен каждый элемент списка, затем идет ключевое слово in и сам список. Команды, которые нужно выполнять в цикле размещаются между словами do и done.

Проверим все на практике и напишем небольшой скрипт, который будет выводить номера от 1 до 5:

 vi for1.sh
!/bin/bash

for number in 1 2 3 4 5

do

echo $numner

done

Дайте скрипту права на выполнение и запустите его:

 chmod +x for1.sh

./for1.sh

Вы увидите, что все выполняется так, как и предполагалось. Программа выведет цифры от 1 до 5, которые мы перечислили в массиве. Вы можете передать циклу любой массив, например, вывод какой-либо другой команды:

!/bin/bash

for iface in $(ls /sys/class/net/)

do

echo $iface

done

Как вы уже поняли, этот цикл выводит список всех, подключенных к системе сетевых интерфейсов. Но в цикле вы можете не только их выводить, но и выполнять какие-либо действия.

Следующий тип цикла for похож на его реализацию в языках программирования Си и С++. Он состоит из трех частей, инициализатора счетчика, условия продолжения выполнения и действия над счетчиком. Вот синтаксис:

for ((счетчик=1; счетчик < 10; счетчик++))

do

команда1

команда2

done

Этот цикл немного сложнее, но он позволяет сделать больше. С помощью такого цикла можно не только перебирать массивы, но и сделать необходимое количество повторений. Рассмотрим пример:

!/bin/bash

for ((i=1; i < 10; i++))

do

echo $i

done

Результат странный, правда? Обратите внимание, как выполняется проверка условия. Значение счетчика сравнивается с эталоном. Действие с переменной счетчиком выполняется сразу же после завершения основного блока команд, а уже потом делается сравнение. Таким образом, у нас при первом выполнении i равно 1, а после него уже два 2. Теперь к завершению девятого прохода значение счетчика будет увеличено на единицу и станет 10. Условие сравнения 10 < 10 не верно, поэтому цикл дальше не выполняется.

С помощью этого же синтаксиса можно сделать бесконечные циклы bash linux:

!/bin/bash

for ((;;))

do

echo "Бесконечный цикл, нажмите CTRL+C для выхода"

done

Если необходимо, вы можете выйти из цикла преждевременно. Но так делать не рекомендуется. Для выхода используйте команду break:

!/bin/bash

for (i=1;i<10;i++)

do

echo Значение счетчика $i

if [[ i -gt 5]]

break

fi

done

Со циклами for мы завершили, теперь вы знаете как они выглядят и что с ними делать. Дальше мы рассмотрим циклы while и until. Они намного проще и более универсальны.

Цикл While

Суть цикла While в том, что он будет повторяться до тех пор, пока будет выполняться условие, указанное в объявлении цикла. Здесь нет никаких счетчиков и если они вам нужны, то организовывать их вам придется самим. Bash цикл while имеет такой синтаксис:

while [ условие ]

do

команда1

команда2

команда3

done

Это работает так: сначала выполняется проверка на правильность условия, если true, выполняется набор команд, затем снова выполняется проверка, и так пока условие не вернет отрицательный результат. Это нам тоже нужно сделать вручную. Рассмотрим пример:

 vi while.sh
!/bin/bash

x=1

while [ $x -lt 5 ]

do

echo "Значение счетчика: $x"

x=$(( $x + 1 ))

done

Здесь сначала мы устанавливаем значение счетчика в единицу, затем, в условии сравниваем его с 5, пока счетчик меньше пяти будут выполняться команды из блока do-done. Но еще в этом блоке нам нужно увеличивать значение счетчика на единицу, что мы и делаем.

Также с помощью while мы можем прочитать несколько строк из стандартного ввода:

 vi while.sh
!/bin/bash

hile read line

do

echo $line

done

Программа будет запрашивать новые строки пока вы не передадите ей символ конца файла с помощью сочетания клавиш Ctrl+D. Бесконечный цикл while bash с помощью while еще проще организовать:

 vi while.sh
while :

do

echo "Бесконечный цикл bash, для выхода нажмите Ctrl+C"

done

Цикл until

Нам осталось рассмотреть последний цикл. Это цикл until. Он очень похож на while и отличается от него только работой условия. Если в первом нужно чтобы условие всегда было истинным, то здесь все наоборот. Цикл будет выполняться пока условие неверно. Синтаксис:

until [ условие ]

do

команда1

команда2

done

Думаю после рассмотрения реального примера со счетчиком будет намного понятнее как это работает:

!/bin/bash

count=1

until [ $count -gt 10 ]

do

echo "Значение счетчика: $count"

count=$(( $count + 1 ))

done

Мы задаем значение счетчика 1 и увеличиваем его на единицу при каждом проходе. Как только условие счетчик больше 10 выполнится, сразу цикл будет остановлен. В циклах while и until тоже можно использовать команды break и continue для выхода из цикла и завершения текущего прохода, но мы не будем это очень подробно рассматривать.

Выводы

В этой статье мы рассмотрели циклы Bash, как с ними работать и в каких ситуациях их можно использовать. Циклы могут стать отличным и незаменимым инструментом при создании сложных скриптов администрирования системы. Если у вас остались вопросы, спрашивайте в комментариях!

Igorka: Лекция №22 — bash. Циклы и функции

На этой лекции мы продолжаем знакомиться с bash. Хочу напомнить, что мы рассматриваем те элементы bash, которые помогут нам понимать скрипты операционной системы. Такими элементами безусловно являются циклы и функции. Если кто-то изучал программирование, то трудностей с пониманием этих вопросов не возникнет.

Цикл for

Цикл for в bash имеет два вида. Рассмотрим сначала классический вариант for. Общий вид следующий:

1
2
3
4

for переменная in последовательность значений
do
команды
done

Между элементами for и in задается переменная, которая по очереди принимает значение из последовательности значений заданной между in и do. Между do и done находятся команды которые выполняются каждый раз когда переменная меняет свое значение. Цикл прекращает работу когда переменная примет последнее значение из последовательности. Значения в последовательности задаются через пробел.

А вот практический пример:

1
2
3
4
5

#!/bin/bash
for i in 1 2 3 a b c
do
  echo i=$i
done

Как вы помните из прошлой лекции переменные в bash не имеют типа поэтому в последовательности могут быть как цифры так и строки или символы.

Если запустить такой скрипт на выполнение получим следующий результат:

1
2
3
4
5
6
7

[email protected]:~/linux$ ./testfor.sh
i=1
i=2
i=3
i=a
i=b
i=c

Последовательность значений можно задавать разными способами. Явно — как в примере выше, или с помощью других переменных, или с помощью специальных команд. Рассмотрим некоторые примеры. Так как значения задаются через пробел, то в качестве таких значений может быть любая переменная, которая содержит строку с пробелами:

1
2
3
4
5
6

#!/bin/bash
S=»1 2 3 a b c»
for i in $S
  do
  echo i=$i
done

Результат будет таким же как и в первом примере.

Если необходимо задать последовательность чисел, то можно воспользоваться командой seq и механизмом подстановки. Команда seq возвращает на экран последовательность числовых значений. Синтаксис прост и будет понятен из примера ниже:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

[email protected]:~/linux$ seq 6
1
2
3
4
5
6
[email protected]:~/linux$ seq 4 6
4
5
6
[email protected]:~/linux$ seq 1 2 6
1
3
5

Используя механизм подстановки, а именно конструкцию $( ) получим следующий пример:

1
2
3
4
5

#!/bin/bash
for i in $(seq 2 2 10)
  do
  echo i=$i
done

Результат:

1
2
3
4
5
6

[email protected]:~/linux$ ./testfor.sh
i=2
i=4
i=6
i=8
i=10

Здесь хочу напомнить о двойных кавычках. Если взять конструкцию $(seq 2 2 10) в двойные кавычки, то результат возвращенный командой seq 2 2 10, а именно 2 4 6 8 10, будет интерпретирован как один элемент:

1
2

[email protected]:~/linux$ ./testfor.sh
i=2 4 6 8 10

Вернемся ко второму виду for. Часто в скриптах можно встретить так называемый С-подобный вариант for, которых используется для циклов на основе чисел. Рассмотрим сразу пример:

1
2
3
4
5

#!/bin/bash
for ((i=1;i<6;i++))
  do
  echo i=$i
done

Как видите конструкция i in $(seq 5) в данном примере заменена на ((i=1;i. Какой из способов выбирать решать вам.

Цикл while

Общий вид:

1
2
3
4

while выражение
do
    команды
done

Цикл выполняется пока проверяемое в выражении условие верно. Как только выражение возвращает ложь выполнение цикла прекращается.

Практический пример:

#!/bin/bash
i=1
while [ $i -lt 7 ]
do
    echo $i
    let i=i+1
done

В нашем примере проверяется, что переменная i меньше (-lt), числа 7 и если это так, то значение переменной выводится на экран. Выражение let i=i+1, увеличивает переменную на единицу, снова происходит проверка и т.д. let говорит интерпретатору о том, что аргументы следует распознавать как числовые значения. Это строку можно было записать как let i++ (c-подобный вариант). При увеличении числа более чем на единицу можно записать так: let i+=2 — в этом случае i будет увеличиваться с шагом 2. Еще один вариант увеличения переменной это использование встроенного калькулятора (работает только с целыми числами). Доступ к калькулятору можно получить через двойные скобки: i=$(($i+1)) или через квадратные: i=$[$i+1] Пользоваться калькулятором можно и в командной строке:

1
2
3
4
5
6

[email protected]:~/linux$ echo $((23*345))
7935
[email protected]:~/linux$ echo $((345/5))
69
[email protected]:~/linux$ echo $((69*5))
345

Цикл until

Похож на while с той лишь разницей, что в нем команды внутри цикла выполняются тогда когда условие не выполняется. Синтаксис такой же только вместо while используется until. Пример:

1
2
3
4
5
6
7

#!/bin/bash
i=1
until [ $i -gt 6 ]
do
    echo «until $i»
    i=$[$i+1]     #или можно написать let i++
done

С циклами нужно быть аккуратными, чтобы не получить вариант бесконечного цикла. Кстати для отладки bash скриптов можно изменить первую строку на#!/bin/bash -x или запускать скрипт командой bash -x:

[email protected]:~/linux$ bash -x ./testfor.sh
+ i=1
+ ‘[‘ 1 -gt 5 ‘]’
+ echo i=1
i=1
+ let i=i+1
+ ‘[‘ 2 -gt 5 ‘]’
+ echo i=2
i=2
+ let i=i+1
+ ‘[‘ 3 -gt 5 ‘]’
+ echo i=3
i=3
+ let i=i+1
+ ‘[‘ 4 -gt 5 ‘]’
+ echo i=4
i=4
+ let i=i+1
+ ‘[‘ 5 -gt 5 ‘]’
+ echo i=5
i=5
+ let i=i+1
+ ‘[‘ 6 -gt 5 ‘]’

Обязательно потренируйтесь в написании небольших скриптов для закрепления понимания работы циклов в bash.

Функции в bash

Функции применяются в bash очень широко. Описываются функции двумя способами: с ключевым словом function, и без него.

Первый способ:

function имя_функции
{
    тело функции
}

Второй способ:

имя_функции ()
{
    тело функции
}

Вызывается функция по имени в любом месте скрипта, но только после описания самой функции. Функции также можно передавать параметры, которые задаются через пробел после вызова (имени) функции. Рассмотрим пример скрипта bash:

#!/bin/bash
function primer
{
    if [ $# -ne 0 ]
    then
        local a=1
        echo «Количество переданных параметров — $#»
        for i in [email protected]
        do
            echo «$a-й параметр — $i»
            let a++
        done
        return 0
    else
        echo «Параметры не передавались»
        return 1
    fi
}
echo «Вызываем функцию с параметрами:»
primer a b c
echo $?
echo «Вызываем функцию без параметров:»
primer
echo $?

В данном примере задана функция с именем primer. Вызов функции с параметрами: primer a b c и без параметров: primer. В теле функции все конструкции вам должны быть знакомы, за исключением $#, $i и [email protected]. $# — возвращает количество параметров переданных функции. В нашем примере это будет число 3. [email protected]возвращает все параметры одной строкой. В примере это будет a b c. А через $1, $2, $3 и т.д. можно обращаться к каждому параметру персонально. $? — содержит код выполнения последней команды. В нашем примере код выполнения функции.

Функция может также возвращать числовое значение через ключевое слово return. Как правило возвращают 0, если функция выполнена без ошибок или отличное от нуля значение, если что-то пошло не так. В примере, в случае вызова функции с параметрами, идет возврат значения 0, а если функция вызывалась без параметров, то будет возврат кода 1.

Все, что касается передачи параметров в функцию, работает точно так же и для скрипта. Скрипту точно также можно передавать параметры и точно также манипулировать ими при помощи $#, [email protected], $N. Из этой же категории и вариант — $0 — который возвращает имя команды запустившей скрипт. Если скрипт запускался по команде ./script.sh, то echo $0 вернет значение ./script.sh, а если по команде /home/igor/linux/script.sh, то будет возвращено значение /home/igor/linux/script.sh.

Читать другие лекции по курсу Администратор ПК с Linux

Команды break и continue. Оболочка Bash. Linux.

Циклы позволяют запускать одну или несколько команд несколько раз, пока не будет выполнено определенное условие. Однако иногда вам может понадобиться изменить поток цикла и завершить цикл или только текущую итерацию.

В Bash операторы break и continue позволяют контролировать выполнение цикла.

 

Команда break в Bash

Оператор break завершает текущий цикл и передает управление программой команде, следующей за прерванным циклом. Он используется для выхода из for, while, until, или select. Синтаксис оператора break принимает следующую форму:

break [n]

[n] является необязательным аргументом и должен быть больше или равен 1. Когда [n] выполняется, n-й замкнутый цикл завершается. break 1 эквивалентно break.

Чтобы лучше понять, как использовать команду break, давайте взглянем на следующие примеры.

В приведенном ниже сценарии выполнение цикла while будет прервано, если текущий элемент будет равен 2:

i=0

while [[ $i -lt 5 ]]
do
  echo "Номер: $i"
  ((i++))
  if [[ $i -eq 2 ]]; then
    break
  fi
done

echo 'Все Сделано!'

 

Номер: 0
Номер: 1
Все Сделано!

 

Вот пример использования команды break внутри вложенных циклов for.

Когда аргумент [n] не задан, break завершает внутренний замкнутый цикл. Внешние циклы не заканчиваются:

for i in {1..3}; do
  for j in {1..3}; do
    if [[ $j -eq 2 ]]; then
      break
    fi
    echo "j: $j"
  done
  echo "i: $i"
done

echo 'Все Сделано!'

 

j: 1
i: 1
j: 1
i: 2
j: 1
i: 3
Все Сделано!

 

Если вы хотите выйти из внешнего цикла, используйте break 2. Аргумент 2 говорит break завершить второй цикл:

for i in {1..3}; do
  for j in {1..3}; do
    if [[ $j -eq 2 ]]; then
      break 2
    fi
    echo "j: $j"
  done
  echo "i: $i"
done

echo 'Все Сделано!'

 

j: 1
Все Сделано!

 

Команда continue в Bash

Команда continue пропускает оставшиеся команды внутри тела цикла для текущей итерации и передает управление программой к следующей итерации цикла.

Синтаксис команды continue следующий:

continue [n]

 

Аргумент [n] является необязательным и может быть больше или равно 1. Когда [n] дается, п-й цикл возобновляются. continue 1 эквивалентно continue.

В приведенном ниже примере, когда в текущем цикле элемент равен 2, то оператор continue вернет к началу цикла и продолжить со следующего цикла.

i=0

while [[ $i -lt 5 ]]; do
  ((i++))
  if [[ "$i" == '2' ]]; then
    continue
  fi
  echo "Номер: $i"
done

echo 'Все Сделано!'

 

Номер: 1
Номер: 3
Номер: 4
Номер: 5
Все Сделано!

 

Следующий скрипт печатает числа 1 через 50, которые делятся на 9.

Если число не делится на 9, оператор continue пропускает команду echo и передает управление на следующую итерацию цикла.

for i in {1..50}; do
  if [[ $(( $i % 9 )) -ne 0 ]]; then
    continue
  fi
  echo "Делится на 9: $i"
done

 

Делится на 9: 9
Делится на 9: 18
Делится на 9: 27
Делится на 9: 36
Делится на 9: 45

 

Вывод

Циклы являются одним из фундаментальных понятий языков программирования. В языках сценариев, таких как Bash, циклы полезны для автоматизации повторяющихся задач.

Оператор break используется для выхода из текущего цикла. Оператор continueиспользуется для выхода из текущей итерации цикла и начала следующей итерации.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Циклы в Bash (for, while, until, break, continue, select)

В этом разделе нашего учебного пособия по Bash мы рассмотрим различные форматы циклов, доступные нам, а также обсудим, когда и почему вы можете использовать каждый из них.

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

В сценариях Bash есть три основных структуры цикла, которые мы рассмотрим ниже. Существует также несколько инструкций, которые мы можем использовать для управления работой циклов.

Цикл While

Один из самых простых циклов для работы это while.

while [ <some test> ]
do
<commands>
done

while [ <some test> ]

do

<commands>

done

В приведенном ниже примере мы напечатаем цифры от 1 до 10:

while_loop.sh

#!/bin/bash
# Базовый цикл while

counter=1
while [ $counter -le 10 ]
do
echo $counter
((counter++))
done

echo All done

#!/bin/bash

# Базовый цикл while

 

counter=1

while [ $counter -le 10 ]

do

echo $counter

((counter++))

done

 

echo All done

Давайте разберем это:

  • Строка 4 — Мы инициализируем счетчик переменных с его начальным значением.
  • Строка 5 — пока тест верен (счетчик меньше или равен 10), давайте сделаем следующие команды.
  • Строка 7 — Мы можем размещать любые команды, которые нам нравятся. Здесь используется эхо , поскольку это простой способ проиллюстрировать, что происходит.
  • Строка 8 — Используя двойные скобки, мы можем увеличить значение счетчика на 1.
  • Строка 9 — Мы находимся в нижней части цикла, поэтому возвращаемся к строке 5 и снова выполняем тест. Если тест верен, выполните команды. Если тест является ложным , то продолжить выполнение каких — либо команд следующее сделано .

Цикл Until

Цикл until довольно похож на цикл while. Разница в том, что он будет выполнять команды внутри него, пока тест не станет истинным.

 Пример:until_loop.sh

#!/bin/bash
# Basic until loop

counter=1
until [ $counter -gt 10 ]
do
echo $counter
((counter++))
done

echo All done

#!/bin/bash

# Basic until loop

 

counter=1

until [ $counter -gt 10 ]

do

echo $counter

((counter++))

done

 

echo All done

Цикл For

Цикл for немного отличается от предыдущих двух циклов. Что он делает, скажем, для каждого из элементов в данном списке, выполните заданный набор команд. Он имеет следующий синтаксис.

for var in <list>
do
<commands>
done

for var in <list>

do

<commands>

done

Цикл for принимает каждый элемент в списке (поочередно, один за другим), назначает этот элемент как значение переменной var , выполняет команды между do и done, затем возвращается к началу, захватывает следующий элемент в список и повторить.

Список определяется как ряд строк, разделенных пробелами.

Вот простой пример для иллюстрации:

#!/bin/bash
# Basic for loop

names=’Stan Kyle Cartman’

for name in $names
do
echo $name
done

echo All done

#!/bin/bash

# Basic for loop

 

names=’Stan Kyle Cartman’

 

for name in $names

do

echo $name

done

 

echo All done

Давайте разберем это:

  • Строка 4 — Создайте простой список, который представляет собой серию имен.
  • Строка 6 — для каждого из элементов в списке $ names присваивает элемент переменной $ name и выполняет следующие команды.
  • Строка 8 — эхо-имя на экране, чтобы показать, что механизм работает. У нас может быть столько команд, сколько нам нравится.
  • Строка 11 — повторите еще одну команду, чтобы показать, что скрипт bash продолжал выполнение как обычно после обработки всех элементов в списке.

Управление циклами: перерыв и продолжение

В большинстве случаев ваши петли проходят ровным и ординарным образом. Иногда, однако, нам может потребоваться вмешаться и немного изменить их ход. Для этого можно сделать два заявления.

Break

Оператор break говорит Бэшу немедленно покинуть цикл. Возможно, что существует нормальная ситуация, которая должна привести к завершению цикла, но есть и исключительные ситуации, в которых она также должна закончиться. Например, возможно, мы копируем файлы, но если свободное место на диске становится ниже определенного уровня, мы должны прекратить копирование.

copy_files.sh

#!/bin/bash
# Сделайте резервный набор файлов
for value in $1/*
do
used=$( df $1 | tail -1 | awk ‘{ print $5 }’ | sed ‘s/%//’ )
if [ $used -gt 90 ]
then
echo Low disk space 1>&2
break
fi
cp $value $1/backup/
done

#!/bin/bash

# Сделайте резервный набор файлов

for value in $1/*

do

used=$( df $1 | tail -1 | awk ‘{ print $5 }’ | sed ‘s/%//’ )

if [ $used -gt 90 ]

then

echo Low disk space 1>&2

break

fi

cp $value $1/backup/

done

Continue

Оператор continue говорит Bash прекратить выполнение этой итерации цикла и начать следующую итерацию. Иногда есть обстоятельства, которые мешают нам идти дальше. Например, возможно, мы используем цикл для обработки ряда файлов, но если мы получим файл, который у нас не имеет разрешения на чтение, мы не должны пытаться его обрабатывать.

copy_check.sh

#!/bin/bash
# Сделайте резервный набор файлов

for value in $1/*
do
if [ ! -r $value ]
then
echo $value not readable 1>&2
continue
fi
cp $value $1/backup/
done

#!/bin/bash

# Сделайте резервный набор файлов

 

for value in $1/*

do

if [ ! -r $value ]

then

echo $value not readable 1>&2

continue

fi

cp $value $1/backup/

done

Select

Механизм select позволяет вам создать простую систему меню. Он имеет следующий формат:

select var in <list>
do
<commands>
done

select var in <list>

do

<commands>

done

При вызове он принимает все элементы в list (аналогично другим циклам, это набор разделенных пробелом элементов) и представляет их на экране с номером перед каждым элементом. После этого будет напечатано приглашение, позволяющее пользователю выбрать номер. Когда они выберите номер и нажмите ввести соответствующий пункт будет присвоен переменным var и команды между делать и делать выполняется. После завершения запроса будет отображаться снова, чтобы пользователь мог выбрать другую опцию.

Несколько замечаний:

  • Проверка ошибок не выполняется. Если пользователь вводит нечто, отличное от числа или числа, не соответствующего элементу, тогда var становится null (пустой)
  • Если пользователь нажимает кнопку ввода без ввода каких-либо данных, список параметров будет отображаться снова.
  • Цикл завершится, когда будет введен сигнал EOF или выдается оператор break.
  • Вы можете изменить системную переменную PS3, чтобы изменить отображаемое приглашение.

Вот простой пример, иллюстрирующий его использование:

select_example.sh

#!/bin/bash
# A simple menu system

names=’Kyle Cartman Stan Quit’

PS3=’Select character: ‘

select name in $names
do
if [ $name == ‘Quit’ ]
then
break
fi
echo Hello $name
done

echo Bye

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#!/bin/bash

# A simple menu system

 

names=’Kyle Cartman Stan Quit’

 

PS3=’Select character: ‘

 

select name in $names

do

if [ $name == ‘Quit’ ]

then

break

fi

echo Hello $name

done

 

echo Bye

Давайте разберем это:

  • Строка 4 — настройка переменной со списком символов и последней опцией, которую мы можем выбрать для выхода. Обратите внимание, что элементы разделяются пробелом.
  • Строка 6 — Измените значение системной переменной PS3 так, чтобы в подсказке было что-то более подробное описание. (По умолчанию это #?)
  • Строки 10 — 13 — Если последний вариант, «Break», выбирается затем break из select цикла.
  • Строка 14 — Распечатайте сообщение, чтобы продемонстрировать, что механизм работал. У вас может быть так много команд здесь, как вам нравится.
  • Строка 17 — Распечатайте сообщение, чтобы показать, что сценарий продолжался как обычно после цикла выбора.

И теперь давайте запустим скрипт Bash:

 

Часть 5. If, else, case в Bash
Часть 7. Функции в Bash

Источник: https://ryanstutorials.net/bash-scripting-tutorial/bash-loops.php

Bash — Цикл until | ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Циклы являются одним из фундаментальных понятий языков программирования. Циклы удобны, когда вы хотите запускать серию команд снова и снова, пока не будет выполнено определенное условие.

В языках сценариев, таких как Bash, циклы полезны для автоматизации повторяющихся задач. В скриптах Bash есть 3 базовых конструкции цикла: for loop, while loop, и until loop..

Эта статья объясняет основы цикла в Bash.

 

Цикл before используется для выполнения заданного набора команд, если данное условие оценивается как ложное.

Цикл until в Bash принимает следующую форму:

until [CONDITION]
do
  [COMMANDS]
done

 

Условие оценивается перед выполнением команд. Если условие оценивается как ложное, команды выполняются. В противном случае, если условие оценивается как истинное, цикл будет прерван, и управление программой будет передано следующей команде.

В приведенном ниже примере на каждой итерации цикл печатает текущее значение переменной counter и увеличивает ее на единицу.

#!/bin/bash

counter=0

until [ $counter -gt 5 ]
do
  echo Counter: $counter
  ((counter++))
done

 

Цикл повторяется до тех пор, пока значение переменной counter больше четырех. Скрипт выдаст следующий вывод:

Counter: 0
Counter: 1
Counter: 2
Counter: 3
Counter: 4
Counter: 5

Пример цикла until в Вash

Следующий скрипт может быть полезен, если у вашего хоста git время простоя, и вместо того, чтобы вручную вводить git pull несколько раз, пока хост не подключится, вы можете запустить скрипт один раз. Он будет пытаться вытащить хранилище, пока он не будет успешно извлечен.

#!/bin/bash

until git pull &> /dev/null
do
    echo "Ожидание хоста git ..."
    sleep 1
done

echo -e "\nРепозиторий git извлечен."

 

Скрипт напечатает «Ожидание хоста git …» и будет спать в течение одной секунды, пока хост git не выйдет в сеть. После извлечения хранилища будет напечатано «Репозиторий git извлечен».

Ожидание хоста git ...
Ожидание хоста git ...
Ожидание хоста git ...

Репозиторий git извлечен.

Заключение

Циклы while и until очень похожи, за исключением того, что цикл while итерирует до тех пор, пока выполняется условие true, а цикл до повторяется до тех пор, пока выполняется условие false.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

циклов — Учебник по созданию сценариев Bash

петель!

Мы идем по кругу.

Введение

Циклы Bash очень полезны. В этом разделе нашего руководства по созданию сценариев Bash мы рассмотрим различные доступные нам форматы циклов, а также обсудим, когда и почему вы можете захотеть использовать каждый из них.

Циклы

позволяют нам принимать серию команд и повторно запускать их до тех пор, пока не будет достигнута определенная ситуация.Они полезны для автоматизации повторяющихся задач.

В сценариях Bash есть 3 основные структуры цикла, которые мы рассмотрим ниже. Также есть несколько операторов, которые мы можем использовать для управления работой циклов.

Циклы пока

Одна из самых простых петель — и петель. Они говорят, что пока выражение истинно, продолжайте выполнять эти строки кода. Они имеют следующий формат:

, а [<некоторый тест>]
сделать
<команды>
выполнено

Вы заметите, что, как и в случае с , если операторы , тест помещается в квадратные скобки [].

В приведенном ниже примере мы напечатаем числа от 1 до 10:

while_loop.sh
  1. #! / Bin / bash
  2. счетчик = 1
  3. , а [$ counter -le 10]
  4. до
  5. echo $ counter
  6. ((счетчик ++))
  7. выполнено
  8. echo Все готово

Давайте разберемся:

  • Строка 4 — Мы инициализируем счетчик переменной его начальным значением.
  • Строка 5 — Пока тест верен (счетчик меньше или равен 10), давайте выполним следующие команды.
  • Строка 7 — Здесь мы можем разместить любые команды, которые захотим. Здесь используется echo , поскольку это простой способ проиллюстрировать, что происходит.
  • Строка 8 — Используя двойные скобки, мы можем увеличить значение счетчика на 1.
  • Строка 9 — Мы находимся в конце цикла, поэтому вернитесь к строке 5 и выполните тест еще раз.Если проверка верна, выполните команды. Если тест ложный, продолжайте выполнение любых команд после done .
  1. ./ while_loop.sh
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. 6
  8. 7
  9. 8
  10. 9
  11. 10
  12. Готово

Распространенная ошибка — это то, что называется с ошибкой на одну .В приведенном выше примере мы могли бы поставить -lt вместо -le (меньше, чем меньше или равно). Если бы мы это сделали, его распечатали бы до 9. Эти ошибки легко сделать, но также легко исправить, как только вы их определили, поэтому не беспокойтесь слишком сильно, если вы сделаете эту ошибку.

До петель

Цикл с по очень похож на цикл while. Разница в том, что он будет выполнять команды внутри него, пока тест не станет истинным.

до [<некоторый тест>]
сделать
<команды>
выполнено

until_loop.sh
  1. #! / Bin / bash
  2. счетчик = 1
  3. до [$ counter -gt 10]
  4. до
  5. echo $ counter
  6. ((счетчик ++))
  7. выполнено
  8. echo Все готово

Как вы можете видеть в приведенном выше примере, синтаксис почти полностью совпадает с синтаксисом цикла while (просто замените while на until).Мы также можем создать сценарий, который будет делать то же самое, что и в примере выше, просто изменив тест соответствующим образом.

Итак, вы можете спросить: «Зачем нужны два разных типа петель?». Мы не обязательно. Цикл while сможет обработать любой сценарий. Иногда, однако, его будет немного легче читать, если мы сформулируем его как , а не . Подумайте о следующем утверждении:

Оставьте полотенце на линии, пока оно не высохнет.

Мы могли бы сказать:

Оставьте полотенце на веревке, пока оно не высохло.

или:

Оставьте полотенце на веревке, пока оно влажное.

Но они не кажутся такими элегантными и понятными. Таким образом, имея и , и , и до , мы можем выбрать тот, который имеет для нас наибольший смысл, и в результате мы получим код, который нам будет легче понять, когда мы его читаем.

Мы всегда должны стремиться к чистому , очевидному и элегантному коду при написании наших сценариев Bash.

Для петель

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

для var в do

done

Цикл for возьмет каждый элемент в списке (по порядку, один за другим), назначит этот элемент как значение переменной var , выполнит команды между do и done, затем вернется наверх, захватит следующий элемент в списке и повторите.

Список определяется как последовательность строк, разделенных пробелами.

Вот простой пример для иллюстрации:

for_loop.sh
  1. #! / Bin / bash
  2. names = «Стэн Кайл Картман»
  3. для имени в $ names
  4. до
  5. echo $ name
  6. выполнено
  7. echo Все готово

Давайте разберемся:

  • Строка 4 — Создайте простой список, состоящий из серии имен.
  • Строка 6 — Для каждого из элементов в списке $ names назначьте элемент переменной $ name и выполните следующие команды.
  • Строка 8 — выведите название на экран, чтобы показать, что механизм работает. У нас может быть столько команд, сколько захотим.
  • Строка 11 — введите другую команду, чтобы показать, что сценарий bash продолжил выполнение в обычном режиме после обработки всех элементов в списке.
  1. ./for_loop.sh
  2. Стандарт
  3. Кайл
  4. Картман
  5. Готово

Диапазоны

Мы также можем обработать серию номеров

for_loop_series.sh
  1. #! / Bin / bash
  2. для значения в {1..5}
  3. до
  4. echo $ value
  5. выполнено
  6. echo Все готово
  • Строка 4 — При указании такого диапазона важно, чтобы между фигурными скобками {} не было пробелов.Если есть, то он будет рассматриваться не как диапазон, а как список элементов.
  1. ./for_loop_series.sh
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5
  7. Готово

При указании диапазона вы можете указать любое число как для начального, так и для конечного значения. Первое значение также может быть больше второго, и в этом случае он будет отсчитываться в обратном порядке.

Также можно указать значение, которое будет увеличиваться или уменьшаться каждый раз. Вы делаете это, добавляя еще две точки (..) и значение для пошагового выполнения.

for_loop_stepping.sh
  1. #! / Bin / bash
  2. для значения в {10..0..2}
  3. до
  4. echo $ value
  5. выполнено
  6. echo Все готово
  1. ./for_loop.sh
  2. 10
  3. 8
  4. 6
  5. 4
  6. 2
  7. 0
  8. Готово

Одно из наиболее полезных применений для циклов — обработка набора файлов. Для этого мы можем использовать подстановочные знаки. Допустим, мы хотим преобразовать серию файлов .html в файлы .php.

convert_html_to_php.sh
  1. #! / Bin / bash
  2. для стоимости в $ 1 / *.HTML
  3. до
  4. cp $ значение $ 1 / $ (базовое имя -s .html $ значение) .php
  5. выполнено

Циклы управления: прерывание и продолжение

В большинстве случаев петли проходят плавно и аккуратно. Однако иногда нам может потребоваться вмешаться и немного изменить их ход. Для этого мы можем сделать два заявления.

Перерыв

Оператор break указывает Bash немедленно покинуть цикл.Может случиться так, что есть нормальная ситуация, которая должна привести к завершению цикла, но есть также исключительные ситуации, в которых он также должен завершиться. Например, возможно, мы копируем файлы, но если свободное место на диске становится ниже определенного уровня, мы должны прекратить копирование.

copy_files.sh
  1. #! / Bin / bash
  2. за 1 доллар США / *
  3. до
  4. used = $ (df $ 1 | tail -1 | awk ‘{print $ 5}’ | sed ‘s /% //’)
  5. , если [$ used -gt 90]
  6. , затем
  7. echo Недостаточно места на диске 1> & 2
  8. перерыв
  9. fi
  10. cp $ value $ 1 / резервная копия /
  11. выполнено

Продолжить

Оператор continue сообщает Bash прекратить выполнение этой итерации цикла и начать следующую итерацию.Иногда есть обстоятельства, которые мешают нам идти дальше. Например, возможно, мы используем цикл для обработки серии файлов, но если мы обнаруживаем файл, для которого у нас нет разрешения на чтение, мы не должны пытаться его обработать.

copy_check.sh
  1. #! / Bin / bash
  2. за 1 доллар США / *
  3. до
  4. если [! -r $ значение]
  5. , затем
  6. echo $ value not readable 1> & 2
  7. продолжить
  8. fi
  9. cp $ value $ 1 / резервная копия /
  10. выполнено

Выбрать

Механизм select позволяет создать простую систему меню.Имеет следующий формат:

выберите var в do

done

При вызове он берет все элементы из списка (как и в других циклах, это набор элементов, разделенных пробелами) и отображает их на экране с номером перед каждым элементом. После этого будет напечатано приглашение, позволяющее пользователю выбрать номер. Когда они выбирают номер и нажимают , введите , соответствующий элемент будет назначен переменной var , и будут выполняться команды между do и done.После завершения снова отобразится запрос, чтобы пользователь мог выбрать другой вариант.

Несколько замечаний:

  • Проверка ошибок не выполняется. Если пользователь вводит что-то другое, кроме числа или числа, не соответствующего элементу, тогда var становится нулевым (пустым)
  • Если пользователь нажимает , введите без ввода каких-либо данных, тогда список опций отобразится снова.
  • Цикл завершится, когда будет введен сигнал EOF или выпущен оператор break.
  • Вы можете изменить системную переменную PS3 , чтобы изменить отображаемую подсказку.

Вот простой пример, иллюстрирующий его использование:

select_example.sh
  1. #! / Bin / bash
  2. names = «Кайл Картман Стэн уволился»
  3. PS3 = ‘Выберите персонажа:’
  4. выберите имя в $ names
  5. до
  6. , если [$ name == ‘Quit’]
  7. , затем
  8. перерыв
  9. fi
  10. echo Hello $ name
  11. выполнено
  12. эхо до свидания

Давайте разберемся:

  • Строка 4 — Установите переменную со списком символов и последней опцией, которую мы можем выбрать для выхода.Обратите внимание, что элементы разделены пробелом.
  • Строка 6 — Измените значение системной переменной PS3 так, чтобы подсказка была установлена ​​на что-то более информативное. (По умолчанию это #?)
  • Строки 10 — 13 — Если выбрана последняя опция «Выход», тогда прерывает из и выбирает цикл .
  • Строка 14 — Распечатайте сообщение, чтобы продемонстрировать, что механизм работает. У вас может быть столько команд, сколько захотите.
  • Строка 17 — Распечатайте сообщение, чтобы показать, что сценарий продолжился как обычно после цикла выбора.

А теперь запустим сценарий Bash:

  1. ./select_example.sh
  2. 1) Кайл 3) Стэн
  3. 2) Картман 4) Выйти из
  4. Выберите символ: 2
  5. Привет Картман
  6. Выберите символ: 1
  7. Привет Кайл
  8. Выберите символ: 4
  9. до свидания

Сводка

пока сделать
Выполнить набор команд, пока проверка верна.
, пока не сделано
Выполнять набор команд, пока проверка не станет истинной.
для дела сделано
Выполнить набор команд для каждого элемента в списке.
перерыв
Выйти из текущего цикла.
продолжить
Остановить эту итерацию цикла и начать следующую итерацию.
выбрать сделать готово
Отображение простой системы меню для выбора элементов из списка.
Ясность
Существует несколько механизмов циклов Bash. Выберите тот, который упрощает выполнение вашего кода.
Планирование
Теперь, когда ваши сценарии становятся немного сложнее, вы, вероятно, захотите потратить немного времени на размышления о том, как вы их структурируете, прежде чем приступить к делу.

Мероприятия

Теперь у нас есть целый набор инструментов, и мы можем заняться еще некоторыми интересными проблемами.

  • Создайте простой скрипт, который будет печатать числа от 1 до 10 (каждое в отдельной строке) и независимо от того, четные они или нечетные.
  • Напишите сценарий Bash, который будет принимать единственный аргумент командной строки (каталог) и печатать каждую запись в этом каталоге. Если запись является файлом, он напечатает его размер. Если запись является каталогом, он напечатает, сколько элементов находится в этом каталоге.
  • Создайте версию игры Mastermind для командной строки. Вместо цветных шариков вы можете использовать буквы или цифры или проявить изобретательность и найти другой способ.
  • Создайте версию игры Tic Tac Toe для командной строки. Сделайте так, чтобы вы могли играть против компьютера.

.

Bash для примеров циклов — Linux Hint

Циклы — очень важная часть любого типа языков программирования или сценариев. Как и в любом другом стандартном программировании, в bash-программировании циклы используются для выполнения повторяющихся задач. Среди трех типов циклов (while, do-while, for) цикл for очень полезен для выполнения различных типов итеративных задач. Здесь показаны основные способы использования цикла for. Но цикл for можно использовать для выполнения некоторых задач продвинутого уровня. Если вы хотите узнать больше об использовании цикла for, вы должны прочитать это руководство.В этом руководстве показаны 12 наиболее полезных примеров цикла for, чтобы узнать о других конкретных применениях цикла for в bash.

Синтаксис:

Цикл

for можно использовать в bash двумя способами. Один из способов — это «for-in», а другой — синтаксис в стиле C. Оба синтаксиса показаны ниже.

для переменной в списке
до
Заявления
выполнено
Или
для ((выражение1; выражение2; выражение3))
до
Операторы
выполнено

Пример-1: Цикл для чтения входной переменной

Список предопределенных строк или массивов можно легко прочитать с помощью цикла for, который показан в предыдущем руководстве по циклу for.В этом примере показано, как содержимое входной переменной можно прочитать с помощью цикла for. Создайте файл с именем « forloop1.sh » с помощью следующего скрипта. После запуска скрипта будет принято входное значение текста, состоящего из нескольких слов. Здесь цикл for используется для разделения текста на слова на основе пробелов и печати каждого слова с указанием позиции.

forloop1.sh

#! / Bin / bash
echo «Введите текст из нескольких слов»
прочитанный текст
i = 1
для слова в $ text
do
echo «Word No- $ i = $ word»
((i = $ i + 1))
выполнено

Выход:

Запустите сценарий.

Здесь берется текст из 5 слов, поэтому печатаются пять строк вывода.

Пример 2: цикл For с оператором break

Оператор break используется внутри цикла for для выхода из цикла. Создайте файл с именем « forloop2.sh» со следующим кодом. Цикл for используется здесь для чтения списка из четырех человек. Здесь проверяются два условия. Если имя человека — « Amir» , а цвет — «Синий» , цикл завершится после печати имени и цвета человека.Цветовые значения второго цикла for будут печататься до тех пор, пока не будет совпадать значение цвета «Синий».

forloop2.sh

для имени в Watson Micheal Sinha Amir Lily
do
if [$ name == ‘Amir’]
, затем
для цвета в Red Green Blue White
do
if [$ color == «Blue»]
затем
echo » Любимый цвет $ name — $ color «
break
else
echo» Текущий цвет $ color «
fi
done
fi
done

Выход:

Запустите сценарий.

После запуска сценария появится следующий вывод. Сначала печатаются два цвета: «Красный» и «Зеленый». Когда появилось значение «Blue», он напечатал имя человека и значение цвета и завершил цикл для оператора «break».

Пример 3: цикл For с оператором continue

Оператор continue используется внутри цикла for, чтобы пропустить любой оператор на основе определенного условия. Создайте файл с именем ‘forloop3.sh ’ следующим скриптом. Здесь переменная с именем $ course используется для присвоения текстового значения. Цикл for используется для чтения переменной $ course. Текстовое значение будет разделено по пробелам и прочитано циклом for. Когда значение «Oracle» совпадает с курсом $ , будет напечатано «Oracle недоступен сейчас». Для других значений «Урок курса $ запущен». Курс, который недоступен, не выполнит последний оператор цикла for для оператора continue.

forloop3.sh

#! / Bin / sh

classes = «Java PHP Oracle VB.net»
для курса в $ курсах
do
if [$ course == ‘Oracle’]
, затем
echo «$ курс сейчас недоступен»
продолжить
fi
echo «Урок курса $ запущен»
выполнено

Выход:

Запустите сценарий.

После запуска сценария появится следующий вывод.

Пример-4: Использование вывода команды как списка

Любой вывод команды bash можно использовать в цикле «for» с помощью обратной кавычки (`).Создайте файл с именем ‘forloop4.sh’ с помощью следующего скрипта. Здесь в цикле используется команда `ls * .txt` . Эта команда сгенерирует список текстового файла из текущего каталога. Цикл for будет перебирать каждое имя файла из вывода команды и сохранять его в переменной $ filename , которая будет напечатана позже. Здесь переменная $ n используется для отображения номера файла.

forloop4.sh

n = 1
для имени файла в `ls *.txt`
do
echo «File No- $ n: $ filename»
((n ++))
done

Выход:

Запустите сценарий.

После запуска сценария появится следующий вывод.

Пример 5: цикл For для чтения диапазона

Цикл «for»

может использоваться для чтения диапазона данных. В следующем примере считывается диапазон символов и выполняется поиск каждого символа, существует ли в тексте или нет. Создайте файл с именем ‘forloop5.sh’ и добавьте следующий сценарий.Здесь диапазон [A-Z] используется в цикле for. Это означает, что цикл for будет повторяться 26 раз для каждой заглавной буквы. Каждый символ ищется в $ text с помощью команды «awk». Если какой-либо символ найден, он сохранит значение в $ result. Следующий. $ result проверяется на наличие любого содержимого. Если он не пуст, будет напечатано сообщение.

forloop5.sh

text = «Bash Scripting Language»
для c в {A..Z}
do
result = `printf» $ text «| awk «/ $ c /» `
if [[$ result! =» «]]
then
echo» $ c существует в тексте «
fi
done

Запустите сценарий.

Здесь алфавиты «B», «L» и «S» встречаются в тексте «Язык сценариев Bash». Итак, печатаются три строки вывода.

Пример 6: цикл For для чтения диапазона с приращением

В этом примере показано, как можно использовать цикл for для поиска всех четных чисел в определенном диапазоне. Создайте файл с именем ‘forloop6.sh’ и добавьте следующий сценарий. Здесь диапазон [2-20] используется в цикле, где каждый шаг увеличивается на 2.Цикл будет повторяться 10 раз и выводить число на каждом шаге.

forloop6.sh

echo «Печать всех четных чисел от 1 до 20»
для n в {2..20..2}
do
echo -n «$ n»
done
printf «\ nDone \ n»

Запустите сценарий.

Все четные числа от 2 до 20 печатаются после запуска сценария.

Пример-7: Цикл For для работы с файлом

В этом примере показано, как можно выполнить цикл for для чтения списка определенного файла.Создайте файл с именем ‘forloop7.sh’ и добавьте следующий сценарий. Здесь цикл используется для получения списка всех текстовых файлов из текущего каталога и замены расширения файла с «.txt» на «.doc».

forloop7.sh

echo «Замена расширения всех текстовых файлов на файл doc.»
для имени файла в * .txt; do
mv «$ filename» «$ {filename% .txt} .doc»
done
echo «Замена выполнена успешно»

Выход:

Сначала создайте текстовый файл, если в текущем каталоге нет текстового файла.Здесь текстовый файл с именем «newfile.txt» создается с помощью команды «cat».

Запустите указанный выше сценарий.

Затем проверьте, изменено ли расширение, с помощью команды ls.

Пример-8: Для цикла с командой последовательности

В следующем примере показано, как можно использовать « seq » в цикле «for» для печати списка последовательных номеров. Команда «seq» работает аналогично диапазону с приращением. Создайте файл с именем ‘forloop8.sh ’ и добавьте следующий скрипт. Цикл будет печатать числа от 1 до 30, пропуская по три числа на каждом шаге.

forloop8.sh

echo «Печатать числа, пропуская 3»
for sq in $ (seq 1 3 30)
do
echo «Sequence Number: $ sq»
done

Выход:

Запустите сценарий.

После запуска сценария появится следующий вывод.

Пример 9: Использование бесконечного цикла for

Бесконечный цикл можно использовать для выполнения любых повторяющихся задач много раз, пока не появится определенное условие.Создайте файл с именем ‘forloop9.sh’ со следующим сценарием, чтобы проверить использование бесконечного цикла. Здесь условие завершения в цикле не определено. Цикл отображает меню из 5 списков, пока не будет нажата цифра 5. Он напечатает конкретное сообщение для других номеров от 1 до 4 и снова отобразит меню.

forloop9.sh

для ((;;))
do
echo «1. Распечатать успешное сообщение»
echo «2. Распечатать информационное сообщение»
echo «3.Распечатать предупреждающее сообщение «
echo» 4. распечатать сообщение об ошибке «
echo» 5. Выход «
echo -n» Выберите любое число из [1-5]: «
прочитать ответ

case» $ answer «в
1) echo» Успешно завершено. «;;
2) echo» Invalid input «;;
3) echo «У вашего компьютера низкий заряд батареи» ;;
4) echo «Отправлено неверное количество аргументов» ;;
5) exit 0 ;;
*) echo «Wrong selection» ;;
esac
done

Запустите сценарий.

Здесь в первый раз нажимается 9, которого нет в списке.Для этого ввода печатается «Неправильный выбор» и снова отображается меню. Затем нажимается 1, и отображается сообщение «Успешно завершено». Затем нажимается 5 для выхода из программы.

Пример-10: Использование цикла For без списка.

Цикл

for может использоваться без вывода списка, массива или команды. В этом примере показано, как можно использовать цикл for для чтения аргументов командной строки. Создайте файл с именем ‘forloop10.sh’ и добавьте следующий сценарий.Цикл будет повторяться в зависимости от количества аргументов командной строки. Переменная $ counter используется для поиска каждого шага цикла, который увеличивается на 1 на каждом шаге.

forloop10.sh

counter = 1
для текста
do
if [$ counter -eq 2]
then
str = «Мой любимый цвет»
elif [$ counter -eq 3]
then
str = «I love»
else
str = «Мне нравится»
fi
echo «$ str $ text»
((counter = $ counter + 1))
done

Запустить сценарий со значениями аргументов командной строки.

$ bash forloop10.sh мороженое синее программирование

Сценарий напечатал сообщение: «Я люблю мороженое», когда счетчик $ равен 1, «Мой любимый цвет — синий», когда счетчик $ равен 2, и «Я люблю программировать», когда счетчик $ равен 3.

Пример 11: Чтение файлов и каталогов с помощью цикла for

Цикл

for может использоваться для печати списка файлов и папок текущего каталога. Создайте файл с именем « forloop11.sh » и добавьте следующий сценарий.Здесь символ «*» используется в цикле «for» для чтения файлов и папок текущего каталога. Цикл считывает имя каждого файла или папки на каждом шаге и распечатывает его в терминале с пробелом «табуляция».

forloop11.sh

printf «Закрепление файлов и папок текущего каталога … \ n \ n»
для списка в *
do
printf «$ list \ t»
done
printf «\ n \ nDone \ n»

Запустите сценарий.

Имена файлов и папок текущего рабочего каталога печатаются после запуска сценария.

Пример-12: Использование запятой в стиле C bash для цикла

Цикл for в стиле C также поддерживается в bash, и этот цикл for имеет три выражения. Это инициализация, условие завершения и увеличение или уменьшение. Но используя запятую (,), вы можете определить несколько переменных инициализации в bash, как показано в этом примере. Создайте файл с именем « forloop12.sh» и добавьте следующий сценарий. В этом скрипте используется вложенный цикл for.Две переменные инициализации, $ team и $ jersey объявлены в первом цикле for. Первый цикл будет завершен, когда $ team будет больше 2. Во внутреннем цикле for нет переменной инициализации, и внутренний цикл будет завершен, если $ jersey больше 3. $ jersey устанавливается в 1 после завершения внутреннего цикла итерации. Таким образом, внешний цикл будет повторяться 2 раза, а внутренний цикл — 3 раза.

forloop12.sh

для ((team = 1, jersey = 1; team <= 2; team ++))
do
for ((; jersey <= 3; jersey ++))
do
echo «Team No- $ team, Jersey No- $ майка «
готово
джерси = 1
готово

Запустите сценарий.

После запуска сценария появится следующий вывод.

Заключение:

В этом руководстве мы попытаемся объяснить многие эффективные способы использования цикла for. Попрактиковавшись в приведенных выше примерах, надеемся, что читатели получат четкие знания о цикле for и 0able, чтобы правильно использовать этот цикл в сценарии bash.

.

Как написать цикл в Bash

Распространенная причина, по которой люди хотят изучить оболочку Unix, — это раскрыть возможности пакетной обработки. Если вы хотите выполнить некоторый набор действий со многими файлами, один из способов сделать это — создать команду, которая выполняет итерацию по этим файлам. В терминологии программирования это называется управление выполнением, и одним из наиболее распространенных примеров является цикл для .

Цикл для — это рецепт, подробно описывающий, какие действия вы хотите, чтобы ваш компьютер выполнял для каждого указанного вами объекта данных (например, файла).

Классика петли для

Легкий цикл, который можно попробовать, — это анализ набора файлов. Вероятно, сам по себе этот цикл не является полезным, но это безопасный способ доказать себе, что у вас есть возможность обрабатывать каждый файл в каталоге индивидуально. Сначала создайте простую тестовую среду, создав каталог и поместив в него копии некоторых файлов. Изначально подойдет любой файл, но для последующих примеров требуются графические файлы (например, JPEG, PNG или аналогичные). Вы можете создать папку и скопировать в нее файлы с помощью файлового менеджера или в терминале:

 

$ mkdir, пример
$ cp ~ / Pictures / vacation / *.{png, jpg}, пример

Измените каталог на новую папку, затем перечислите файлы в нем, чтобы убедиться, что ваша тестовая среда соответствует вашим ожиданиям:

 

$ cd example
$ ls -1
cat.jpg
design_maori.png
otago.jpg
waterfall.png

Синтаксис для перебора каждого файла отдельно в цикле: создать переменную (например, f для файла). Затем определите набор данных, по которому переменная должна циклически перебираться. В этом случае циклически переберите все файлы в текущем каталоге, используя подстановочный знак * (подстановочный знак * соответствует всем ).Затем завершите это вводное предложение точкой с запятой (; ).

  $ за ф в *;  

В зависимости от ваших предпочтений, вы можете нажать здесь Возврат . Оболочка не будет пытаться выполнить цикл, пока он не будет синтаксически завершен.

Затем определите, что вы хотите делать с каждой итерацией цикла. Для простоты используйте команду file , чтобы получить немного данных о каждом файле, представленном переменной f (но с добавлением $ перед оболочкой, чтобы она поменяла значение переменной для любого файла. переменная в настоящее время содержит):

  do file $ f;  

Завершите предложение другой точкой с запятой и закройте цикл:

  готово  

Нажмите Return , чтобы оболочка циклически перебирала и все в текущем каталоге.Цикл для назначает каждый файл один за другим переменной f и выполняет вашу команду:

 

$ за ф в *; сделать
> файл $ f;
> done
cat.jpg: данные изображения JPEG, стандарт EXIF ​​2.2
design_maori.png: данные изображения PNG, 4608 x 2592, 8-битный / цветной RGB, без чересстрочной развертки
otago.jpg: данные изображения JPEG, стандарт EXIF ​​2.2
waterfall.png: данные изображения PNG, 4608 x 2592, 8-битный / цветной RGB, без чересстрочной развертки

Также можно написать так:

 

$ за ф в *; сделать файл $ f; сделано
кат.jpg: данные изображения JPEG, стандарт EXIF ​​2.2
design_maori.png: данные изображения PNG, 4608 x 2592, 8-битный / цветной RGB, без чересстрочной развертки
otago.jpg: данные изображения JPEG, стандарт EXIF ​​2.2
waterfall.png: PNG: PNG данные изображения, 4608 x 2592, 8-битный / цветной RGB, без чересстрочной развертки

И многострочный, и однострочный форматы одинаковы для вашей оболочки и дают точно такие же результаты.

Практический пример

Вот практический пример того, как цикл может быть полезен для повседневных вычислений.Предположим, у вас есть коллекция фотографий с отпуска, которые вы хотите отправить друзьям. Ваши файлы фотографий огромны, поэтому их слишком много для отправки по электронной почте и неудобно загружать в службу обмена фотографиями. Вы хотите создать уменьшенные веб-версии своих фотографий, но у вас есть 100 фотографий, и вы не хотите тратить время на уменьшение каждой фотографии по одной.

Сначала установите команду ImageMagick с помощью диспетчера пакетов в Linux, BSD или Mac. Например, в Fedora и RHEL:

  $ sudo dnf установить ImageMagick  

В Ubuntu или Debian:

  $ sudo apt установить ImageMagick  

В BSD используйте портов или pkgsrc.На Mac используйте Homebrew или MacPorts.

После установки ImageMagick у вас есть набор новых команд для работы с фотографиями.

Создайте каталог назначения для файлов, которые вы собираетесь создать:

  $ mkdir tmp  

Чтобы уменьшить каждую фотографию до 33% от исходного размера, попробуйте следующий цикл:

  $ за ф в *; преобразовать $ f -масштаб 33% tmp / $ f; сделано  

Затем загляните в папку tmp , чтобы увидеть ваши масштабированные фотографии.

Вы можете использовать любое количество команд в цикле, поэтому, если вам нужно выполнить сложные действия с пакетом файлов, вы можете разместить весь рабочий процесс между операторами do и done цикла for . Например, предположим, что вы хотите скопировать каждую обработанную фотографию прямо в общий каталог фотографий на вашем веб-хосте и удалить файл фотографии из вашей локальной системы:

 

$ за ф в *; do
convert $ f -scale 33% tmp / $ f
scp -i seth_web tmp / $ f seth @ example.com: ~ / public_html
trash tmp / $ f;
выполнено

Для каждого файла, обрабатываемого циклом для , ваш компьютер автоматически выполняет три команды. Это означает, что если вы обработаете таким образом всего 10 фотографий, вы сэкономите 30 команд и, вероятно, как минимум столько же минут.

Ограничение цикла

Цикл не всегда должен просматривать каждый файл. Возможно, вы захотите обработать только файлы JPEG в каталоге вашего примера:

 

$ за ф в *.jpg; преобразовать $ f -масштаб 33% tmp / $ f; done
$ ls -m tmp
cat.jpg, otago.jpg

Или вместо обработки файлов вам может потребоваться повторить действие определенное количество раз. Переменная цикла для определяется любыми данными, которые вы ей предоставляете, поэтому вы можете создать цикл, который выполняет итерацию по числам вместо файлов:

 

$ за n в {0..4}; сделать echo $ n; выполнено
0
1
2
3
4

Больше зацикливания

Теперь вы знаете достаточно, чтобы создавать свои собственные петли.Пока вы не научитесь зацикливаться, используйте их на копиях файлов, которые вы хотите обработать, и как можно чаще используйте команды со встроенными средствами защиты, чтобы не допустить искажения ваших данных и совершения непоправимых ошибок, таких как случайное переименование целый каталог файлов с одинаковыми именами, каждый из которых перезаписывает другой.

Для продвинутых тем для циклов читайте дальше.

Не все оболочки являются Bash

Ключевое слово для встроено в оболочку Bash.Многие похожие оболочки используют одно и то же ключевое слово и синтаксис, но некоторые оболочки, например tcsh, вместо этого используют другое ключевое слово, например foreach .

В tcsh синтаксис похож по духу, но более строг, чем в Bash. В следующем примере кода не вводите строку foreach? в строках 2 и 3. Это вторичная подсказка, предупреждающая вас о том, что вы все еще в процессе построения цикла.

 

$ foreach f (*)
foreach? файл $ f
foreach? конец
кат.jpg: данные изображения JPEG, стандарт EXIF ​​2.2
design_maori.png: данные изображения PNG, 4608 x 2592, 8-битный / цветной RGB, без чересстрочной развертки
otago.jpg: данные изображения JPEG, стандарт EXIF ​​2.2
waterfall.png: PNG: PNG данные изображения, 4608 x 2592, 8-битный / цветной RGB, без чересстрочной развертки

В tcsh и foreach , и end должны отображаться отдельно на отдельных строках, поэтому вы не можете создать цикл for в одной строке, как это можно сделать в Bash и подобных оболочках.

Для циклов с командой find

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

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

Команда find предназначена для помощи в поиске файлов на жестких дисках. Его синтаксис прост: вы указываете путь к местоположению, которое хотите найти, и find находит все файлы и каталоги:

 

$ найти.
.
./cat.jpg
./design_maori.png
./otago.jpg
./waterfall.png

Вы можете отфильтровать результаты поиска, добавив часть имени:

 

$ найти. -name "* jpg"
./cat.jpg
./otago.jpg

Самое замечательное в find заключается в том, что каждый найденный файл может быть помещен в цикл с использованием флага -exec . Например, чтобы уменьшить только фотографии PNG в вашем примере каталога:

 

$ найти.-name "* png" -exec convert {} -scale 33% tmp / {} \;
$ ls -m tmp
design_maori.png, waterfall.png

В предложении -exec символы скобок {} заменяют любой элемент , который обрабатывается (другими словами, любой файл, оканчивающийся на PNG, который был обнаружен, по одному). Предложение -exec должно заканчиваться точкой с запятой, но Bash обычно пытается использовать точку с запятой для себя. Вы «экранируете» точку с запятой с помощью обратной косой черты ( \; ), чтобы find знал, что эта точка с запятой должна рассматриваться как завершающий символ.

Команда find очень хороша в том, что она делает, и иногда может быть слишком хорошей. Например, если вы повторно используете его для поиска файлов PNG для другого процесса обработки фотографий, вы получите несколько ошибок:

 

$ найти. -name "* png" -exec convert {} -flip -flop tmp / {} \;
convert: невозможно открыть изображение `tmp /./ tmp / design_maori.png ':
Нет такого файла или каталога @ error / blob.c / OpenBlob / 2643.
...

Кажется, что find обнаружил все файлы PNG, а не только те, которые находятся в вашем текущем каталоге (.), но также и те, которые вы обработали ранее и поместили в подкаталог tmp . В некоторых случаях вам может потребоваться find для поиска в текущем каталоге и во всех других каталогах в нем (и во всех каталогах в , которые находятся в ). Это может быть мощный инструмент рекурсивной обработки, особенно в сложных файловых структурах (например, каталогах музыкальных исполнителей, содержащих каталоги альбомов, заполненных музыкальными файлами), но вы можете ограничить это с помощью параметра -maxdepth .

Чтобы найти только файлы PNG в текущем каталоге (исключая подкаталоги):

  $ найти. -maxdepth 1 -name "* png"  

Чтобы найти и обработать файлы в текущем каталоге плюс дополнительный уровень подкаталогов, увеличьте максимальную глубину на 1:

  $ найти. -maxdepth 2 -name "* png"  

По умолчанию спускается во все подкаталоги.

Зацикливание для развлечения и прибыли

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

Вы можете и должны рассматривать цикл как любую другую команду, держа его под рукой, когда вам нужно повторить одно или два действия с несколькими файлами. Однако это также законный путь к серьезному программированию, поэтому, если вам нужно выполнить сложную задачу с любым количеством файлов, найдите минутку в своем рабочем дне, чтобы спланировать свой рабочий процесс. Если вы можете достичь своей цели в одном файле, то обернуть этот повторяемый процесс в цикл на относительно просто, и единственное необходимое «программирование» — это понимание того, как работают переменные, и достаточная организация, чтобы отделить необработанные файлы от обработанных.Немного попрактиковавшись, вы можете перейти от пользователя Linux к пользователю Linux, который знает, как писать цикл, так что выходите и заставьте свой компьютер работать на вас!

.

12 Bash Примеры циклов для сценариев оболочки Linux

Доступны два типа циклов bash for. Один использует ключевое слово «in» со списком значений, другой использует синтаксис, подобный программированию на C.

Эта статья является частью нашей продолжающейся серии руководств по bash.

Это объясняет оба метода цикла bash for и предоставляет 12 различных примеров того, как использовать цикл bash for в сценариях оболочки.

Добавьте эту статью в закладки для использования в будущем, так как это единственная статья о том, как использовать bash для циклов с примерами, вам когда-либо понадобится.

Метод 1: Bash For Loop с использованием «in» и списка значений

Синтаксис:

 для имени переменной в списке
делать
 command1
 command2
 ..
сделано 

В синтаксисе выше:

  • for, in, do и done — ключевые слова
  • «список» содержит список значений. Список может быть переменной, содержащей несколько слов, разделенных пробелами. Если список отсутствует в операторе for, он принимает позиционный параметр, который был передан в оболочку.
  • имя_переменной — любое имя переменной Bash.

В этой форме оператор for выполняет команды, заключенные в тело, один раз для каждого элемента в списке. Например, если список значений содержит 5 элементов, цикл for будет выполнен всего 5 раз, по одному разу для каждого элемента в списке. Текущий элемент из списка будет сохраняться в переменной «varname» каждый раз в цикле. Это «имя переменной» можно обработать в теле цикла for.

Метод 2: Bash For Loop с использованием синтаксиса типа C

Вторая форма цикла for аналогична циклу for в языке программирования «C», который имеет три выражения (инициализация, условие и обновление).

 для ((expr1; expr2; expr3))
делать
 command1
 command2
 ..
сделано 

В приведенном выше синтаксисе команд bash

  • Перед первой итерацией вычисляется выражение expr1. Обычно это используется для инициализации переменных цикла.
  • Все операторы между do и done выполняются повторно, пока значение expr2 не станет TRUE.
  • После каждой итерации цикла вычисляется выражение expr3. Обычно это используется для увеличения счетчика цикла.

Следующие 12 примеров показывают, как использовать циклы для bash разными способами.

1. Статические значения для списка после ключевого слова «in»

В следующем примере список значений (понедельник, вторник, среда, четверг и пятница) приводится непосредственно после ключевого слова «in» в цикле bash for.

 $ кот for1.sh
я = 1
на день в пн вт ср чт пт
делать
 echo "День недели $ ((i ++)): $ day"
сделанный

$ ./for1.sh
День недели 1: пн.
День недели 2: Вт
Будний день 3: среда
День недели 4: чт.
Будний день 5: пт 

Внимание: Список значений не должен разделяться запятыми (пн, вт, ср, чт, пт).Запятая будет рассматриваться как часть значения. Т.е. вместо «Пн» в качестве значения будет использоваться «Пн», как показано в примере ниже.

 $ cat for1-wrong1.sh
я = 1
на день в пн, вт, ср, чт, пт
делать
 echo "День недели $ ((i ++)): $ day"
сделанный

$ ./for1-wrong1.sh
День недели 1: пн,
День недели 2: Вт,
Будний день 3: ср,
День недели 4: чт,
Будний день 5: пт 

Осторожно: Список значений не следует заключать в двойные кавычки.(«Пн вт ср чт пт»). Если вы заключите в двойные кавычки, оно будет рассматриваться как одно значение (вместо 5 разных значений), как показано в примере ниже.

 $ кот for1-wrong2.sh
я = 1
на день в "пн вт ср чт пт"
делать
 echo "День недели $ ((i ++)): $ day"
сделанный

$ ./for1-wrong2.sh
День недели 1: пн вт ср чт пт 

2. Переменная для списка после ключевого слова «in»

Вместо того, чтобы предоставлять значения непосредственно в цикле for, вы можете сохранить значения в переменной и использовать переменную в цикле for после ключевого слова «in», как показано в следующем примере.

 $ кот for2.sh
я = 1
будние дни = "пн вт ср чт пт"
за день в $ будние дни
делать
 echo "День недели $ ((i ++)): $ day"
сделанный

$ ./for2.sh
День недели 1: пн.
День недели 2: Вт
Будний день 3: среда
День недели 4: чт.
Будний день 5: пт 

Осторожно : Рекомендуется всегда указывать переменные bash при обращении к ним. Из этого правила передовой практики есть несколько исключений. Это одна из них. Если вы заключите переменную в двойные кавычки в этом цикле for, список значений будет рассматриваться как одно значение.Многие люди попадают в эту ловушку. Будьте осторожны и не заключайте переменную в двойные кавычки в цикле for.

 $ cat for2-wrong.sh
я = 1
будние дни = "пн вт ср чт пт"
на день в "$ будние дни"
делать
 echo "День недели $ ((i ++)): $ day"
сделанный

$ ./for2-wrong.sh
День недели 1: пн вт ср чт пт 

3. Не указывать список; получить из позиционных параметров

Если вы не укажете ключевое слово in, за которым следует какой-либо список значений в цикле bash for, он будет использовать позиционные параметры (т.е.e аргументы, которые передаются сценарию оболочки).

 $ кот for3.sh
я = 1
на день
делать
 echo "День недели $ ((i ++)): $ day"
сделанный

$ ./for3.sh пн вт ср чт пт
День недели 1: пн.
День недели 2: Вт
Будний день 3: среда
День недели 4: чт.
Будний день 5: пт 

Осторожно: Будьте осторожны при использовании этого метода. Вы не должны включать ключевое слово «in» в цикл for. Если вы оставите ключевое слово «in» без значений, оно не будет использовать позиционный параметр, как показано ниже.Он не войдет внутрь цикла. Т.е. цикл for никогда не будет выполнен, как показано в примере ниже.

 $ кот for3-wrong.sh
я = 1
на день в
делать
 echo "День недели $ ((i ++)): $ day"
сделанный

$ ./for3-wrong.sh пн вт ср чт пт 

Примечание : Обратитесь к нашей предыдущей статье, чтобы узнать больше о позиционных параметрах bash.

4. Вывод команды Unix в виде значений списка после ключевого слова «in»

Вы можете использовать вывод любой команды UNIX / Linux в качестве списка значений для цикла for, заключив команду в обратные галочки », как показано ниже.

 $ кот for4.sh
я = 1
для имени пользователя в ʻawk -F: '{print $ 1}' / etc / passwd`
делать
 echo "Имя пользователя $ ((i ++)): $ username"
сделанный

$ ./for4.sh
Имя пользователя 1: ramesh
Имя пользователя 2: john
Имя пользователя 3: preeti
Имя пользователя 4: jason
.. 

5. Перебирайте файлы и каталоги в цикле for

Чтобы просмотреть файлы и каталоги в определенном каталоге, просто перейдите в этот каталог и введите * в цикле for, как показано ниже.

Следующий пример будет проходить через все файлы и каталоги в вашем домашнем каталоге.

 $ кот for5.sh
я = 1
cd ~
для позиции в *
делать
 echo "Элемент $ ((i ++)): $ item"
сделанный

$ ./for5.sh
Пункт 1: positional-parameters.sh
Пункт 2: backup.sh
Пункт 3: emp-report.awk
Пункт 4: item-list.sed
Пункт 5: employee.db
Пункт 8: хранение
Пункт 9: 

загрузок

Использование * в цикле for bash аналогично подстановке файлов, которые мы используем в командной строке Linux, когда используем команду ls (и другие команды).

Например, следующее будет отображать все файлы и каталоги в вашем домашнем каталоге.Это концепция, которая используется в приведенном выше примере for5.sh.

 кд ~
ls * 

Далее будут отображены все файлы * .conf, которые начинаются с a, b, или, c или d в каталоге / etc.

 $ ls -1 /etc/[abcd impression*.conf
/etc/asound.conf
/etc/autofs_ldap_auth.conf
/etc/cas.conf
/etc/cgconfig.conf
/etc/cgrules.conf
/etc/dracut.conf 

Тот же аргумент, который используется в приведенной выше команде ls, можно использовать в цикле bash for, как показано в примере ниже.

 $ кот за 5-1.ш
я = 1
для файла в /etc/[abcd provided*.conf
делать
 echo "Файл $ ((i ++)): $ file"
сделанный

$ ./for5-1.sh
Файл 1: /etc/asound.conf
Файл 2: /etc/autofs_ldap_auth.conf
Файл 3: /etc/cas.conf
Файл 4: /etc/cgconfig.conf
Файл 5: /etc/cgrules.conf
Файл 6: /etc/dracut.conf 

6. Выход из цикла for

Вы можете выйти из цикла for, используя команду «break», как показано ниже.

 $ кот за 6.ш
я = 1
на день в пн вт ср чт пт
делать
 echo "День недели $ ((i ++)): $ day"
 если [$ i -eq 3]; тогда
   сломать;
 фи
сделанный

$ ./for6.sh
День недели 1: пн.
День недели 2: Вт 

7. Продолжайте цикл с вершины цикла

При определенных условиях вы можете игнорировать остальные команды цикла for и снова продолжить цикл сверху (для следующего значения в списке), используя команду continue, как показано ниже.

В следующем примере «(ВЫХОДНЫЕ)» добавляются к субботам и воскресеньям, а «(будние дни)» — к остальным дням.

 $ кот for7.sh
я = 1
на день в пн вт ср чт пт сб вс
делать
 echo -n "День $ ((i ++)): $ день"
 если [$ i -eq 7 -o $ i -eq 8]; тогда
   echo "(ВЫХОДНЫЕ)"
   Продолжать;
 фи
 эхо "(будний день)"
сделанный

$ ./for7.sh
День 1: пн (будний день)
День 2: Вт (будний день)
День 3: среда (будний день)
День 4: чт (будний день)
День 5: пт (будний день)
День 6: сб (ВЫХОДНЫЕ)
День 7: Вс (ВЫХОДНЫЕ) 

8. Цикл Bash for с использованием синтаксиса программы C

В этом примере используется 2-й метод цикла for в bash, который аналогичен синтаксису цикла for в языке C.В следующем примере генерируется 5 случайных чисел с использованием цикла for в стиле C.

 $ кот for8.sh
для ((i = 1; i <= 5; i ++))
делать
 echo "Случайное число $ i: $ RANDOM"
сделанный

$ ./for8.sh
Случайное число 1: 23320
Случайное число 2: 5070
Случайное число 3: 15202
Случайное число 4: 23861
Случайное число 5: 23435 

9. Бесконечный Bash для цикла

Если вы не укажете начало, условие и приращение в цикле for в стиле C bash, он станет бесконечным.Вам нужно нажать Ctrl-C, чтобы остановить цикл.

 $ кот for9.sh
я = 1;
за (( ; ; ))
делать
   спать $ я
   echo "Число: $ ((i ++))"
сделано 

Как мы уже говорили выше, нажмите Ctrl-C, чтобы выйти из бесконечного цикла for в bash.

 $ ./for9.sh
Номер 1
Номер 2
Номер: 3 

10. Использование запятой в стиле C bash для цикла

В цикле bash c-style, помимо увеличения значения, используемого в условии, вы также можете увеличить какое-то другое значение, как показано ниже.

В разделе инициализации и разделе приращения цикла for в стиле C bash можно указать несколько значений, разделив их запятыми, как показано ниже.

Следующий цикл for выполняется всего 5 раз с использованием переменной i. Однако переменная j начинается с 5 и увеличивается на 5 каждый раз при выполнении цикла.

 $ кот за 10.sh
для ((i = 1, j = 10; i <= 5; i ++, j = j + 5))
делать
 echo "Число $ i: $ j"
сделанный

$ ./for10.sh
Число 1: 10
Номер 2:15
Число 3:20
Число 4: 25
Номер 5: 30 

11.Диапазон чисел после ключевого слова «in»

Вы можете перебирать, используя диапазон чисел в цикле for «in», используя фигурные скобки.

Следующий пример повторяется 10 раз, используя значения от 1 до 10.

 $ кот за11.sh
для числа в {1..10}
делать
 echo "Число: $ num"
сделанный

$ ./for11.sh
Номер 1
Номер 2
Число: 3
Число: 4
Число: 5
... 

12. Диапазон чисел с приращениями после ключевого слова «in»

В следующем примере повторяется 5 раз, используя значения от 1 до 10 с шагом 2.т.е. он начинается с 1 и продолжает увеличиваться на 2, пока не достигнет 10.

 $ кот за 12.sh
для числа в {1..10..2}
делать
 echo "Число: $ num"
сделанный

$ ./for12.sh
Номер 1
Число: 3
Число: 5
Номер: 7
Номер: 9 

PS: Не забудьте добавить эту статью в закладки для дальнейшего использования.

Если вам понравилась эта статья, возможно, вам также понравится ..

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

2021 © Все права защищены. Карта сайта