Краткое введение в программирование на Bash - страница 5

Шрифт
Интервал

стр.

>#!/bin/bash

>x=0;

>while [ "$x" -le 10 ]; do

>echo "Текущее значение х: $х"

># Увеличиваем значение х:

>x=$(expr $x + 1)

>sleep 1

>done

Здесь мы используем для проверки состояния переменной x запись с квадратными скобками. Опция -le означает «меньше или равно (less or equal)». Говоря обычным языком приведенный код говорит: «пока (while) х меньше или равен 10, выводить на экран текущее значение х, после чего добавлять к текущему значению х единицу». Оператор sleep 1 приостанавливает выполнение программы на одну секунду.

Ниже приведен список возможных операций сравнения целых чисел[9]:

>x -eq y x = y (equal)

>x -ne y x не равен y (not equal)

>x -gt y x больше, либо равен y (greater than)

>x -lt y x меньше, либо равен y (lesser than)

>Операторы сравнения строк:

>x = y строка x идентична y

>x != y строка х не совпадает y

>-n x выражение истинно, если строка х ненулевой длины

>-z x выражение истинно, если строка х имеет нулевую длину

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

>x=$(expr $x + 1)

Комментарий приведенный выше он говорит нам, что он увеличивает х на 1. Но что означает запись$ (...)? Это переменная? Нет. На самом деле это способ сказать оболочке, что вы хотите запустить команду expr $x + 1, и присвоить результат ее выполнения — х. Любая команда, заключенная в $ (…) будет выполняться:

>#!/bin/bash

>me=$(whoami)

>echo "Привет! Меня зовут $me"

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

>#!/bin/bash

>echo "Привет! Меня зовут $(whoami)"

Вы сами можете выбрать, какая из записей вам ближе и понятнее. Существует и другой способ для выполнения команд или передачи результата их выполнения переменной. Как это сделать — будет объяснено позже. Пока используйте запись вида $(…).

until … do … done

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

>#!/bin/bash

>x=0

>until [ "$x" -ge 10 ]; do

>echo "Текущее значение х равно $ х"

>x=$(expr $x + 1)

>sleep 1

>done

Эта часть кода выглядит знакомой. Попробуйте ее набрать и посмотреть, что он делает. Приведенный цикл будет работать, пока x не станет больше или равен 10. Когда величина x достигнет значения 10, цикл остановится. Таким образом, последнее значение напечатанное значение х будет 9.

for … in … do … done

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

>#!/bin/bash

>echo -n "Проверка системы на наличие ошибок"

>for dots in 1 2 3 4 5 6 7 8 9 10; do

>echo -n "."

>done

>echo "Ошибок не обнаружено"

Опция -n команды echo предотвращает автоматический перевод строки. Попробуйте один раз вариант с -n и вариант без этой опции, чтобы понять, что я имею в виду. Переменная dots последовательно принимает значения от 1 до 10 и одновременно скрипт печатает на экране точку.

Приведенный дальше пример показывает, что я имею в виду под выражением «переменная последовательно принимает несколько значений»:

>#!/bin/bash

>for x in paper pencil pen; do

>echo "значение переменной х равно $х"

>sleep 1

>done

При запуске программы, вы видите, что х сначала имеет значение «pencil», а затем она принимает значение «pen». Когда у переменной заканчивается список возможных значений, цикл завершается.

Ниже приведен гораздо более полезный пример. Этот скрипт добавляет расширение .html для всех файлов в текущей директории[10]:

>#!/bin/bash

>for file in *; do

>echo "Добавляем расширение .html для файла $file ..."

>mv $file $file.html

>sleep 1

>done

Символ * имеет специальное значение, которое в данном случае означает «все в текущем каталоге», т.е. — все файлы в каталоге. Переменная file последовательно принимает значения, соответствующие именам файлов в текущем каталоге. Затем используется программа mv для переименования файла в файл с расширением .html:

case … in … esac

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


стр.

Похожие книги