Вам бонус- начислено 1 монета за дневную активность. Сейчас у вас 1 монета

22 - bash. Циклы и функции кратко

Лекция



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

На этой лекции мы продолжаем знакомиться с 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

igor@ubuntu:~/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

igor@ubuntu:~/linux$ seq 6
1
2
3
4
5
6
igor@ubuntu:~/linux$ seq 4 6
4
5
6
igor@ubuntu:~/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

igor@ubuntu:~/linux$ ./testfor.sh
i=2
i=4
i=6
i=8
i=10

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

1
2

igor@ubuntu:~/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<6;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

igor@ubuntu:~/linux$ echo $((23*345))
7935
igor@ubuntu:~/linux$ echo $((345/5))
69
igor@ubuntu:~/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:

igor@ubuntu:~/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 $@
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 и $@.$# - возвращает количество параметров переданных функции. В нашем примере это будет число 3.$@возвращает все параметры одной строкой. В примере это будет a b c. А через $1, $2, $3 и т.д. можно обращаться к каждому параметру персонально. $? - содержит код выполнения последней команды. В нашем примере код выполнения функции.

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

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

22 - bash. Циклы и функции

списки синхронные и асинхронные

22 - bash. Циклы и функции

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

создано: 2014-09-13
обновлено: 2024-11-12
212



Рейтиг 9 of 10. count vote: 2
Вы довольны ?:


Поделиться:

Найди готовое или заработай

С нашими удобными сервисами без комиссии*

Как это работает? | Узнать цену?

Найти исполнителя
$0 / весь год.
  • У вас есть задание, но нет времени его делать
  • Вы хотите найти профессионала для выплнения задания
  • Возможно примерение функции гаранта на сделку
  • Приорететная поддержка
  • идеально подходит для студентов, у которых нет времени для решения заданий
Готовое решение
$0 / весь год.
  • Вы можите продать(исполнителем) или купить(заказчиком) готовое решение
  • Вам предоставят готовое решение
  • Будет предоставлено в минимальные сроки т.к. задание уже готовое
  • Вы получите базовую гарантию 8 дней
  • Вы можете заработать на материалах
  • подходит как для студентов так и для преподавателей
Я исполнитель
$0 / весь год.
  • Вы профессионал своего дела
  • У вас есть опыт и желание зарабатывать
  • Вы хотите помочь в решении задач или написании работ
  • Возможно примерение функции гаранта на сделку
  • подходит для опытных студентов так и для преподавателей

Комментарии


Оставить комментарий
Если у вас есть какое-либо предложение, идея, благодарность или комментарий, не стесняйтесь писать. Мы очень ценим отзывы и рады услышать ваше мнение.
To reply

Операционная система LINUX

Термины: Операционная система LINUX