KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Гарольд Родригес - Краткое введение в программирование на Bash

Гарольд Родригес - Краткое введение в программирование на Bash

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн "Гарольд Родригес - Краткое введение в программирование на Bash". Жанр: Программирование издательство неизвестно, год неизвестен.
Перейти на страницу:

#!/bin/bash

while :; do

echo "Нажмите CTRL-C для выхода."

done

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

#!/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. Поясним на примере:

#!/bin/bash

x=5 # инициализируем х значением 5

# проверяем значение х:

case $x in

0) echo "значение х равно 0"

;;

5) echo "значение х равно 5"

;;

9) echo "значение х равно 9"

;;

*) echo "значение неизвестно"

;;

esac

Оператор case проверяет переменную х на равенство трем значениям. В приведенном примере, он сначала проверит, равен ли х нулю 0, затем равен ли он 5, затем равен ли он 9. И, если все проверки завершились неудачно, скрипт выведет сообщение, что значение x определить не получилось. Помните, что «*» означает «все», и в этом случае, «любое другое значение, помимо указанных явно». Если х имеет любое другое значение, отличное от 0, 5 или 9, то это значение попадает во категорию «*». При использовании сase каждое условие должно заканчиваться двумя точками с запятой.

Зачем нужно использовать case, когда вы можно использовать if? Ниже приведен пример эквивалентного скрипта, написанного с использованием if. Решение о том, что быстрее написать и легче прочесть, предлагается принять самостоятельно:

#!/bin/bash

x=5 # инициализируем х значением 5

if [ "$x" -eq 0 ]; then

echo "Значение х равно 0"

elif [ "$x" -eq 5 ]; then

echo "значение х равно 5"

elif [ "$x" -eq 9 ]; then

echo "значение х равно 9"

else

echo "Значение х определить не удалось"

fi

Использование кавычек

Кавычки играют важную роль в написании скриптов оболочки. Существует три типа кавычек. Это двойные кавычки: «, одинарные ‘ (апостроф) и обратные `[11]. Имеет ли каждый из приведенных видов какое-то особое значение? Да.

Примечание:Статья Wildcards, Quotes, Back Quotes, Apostrophes in shell commands ( * ? [] ” ‘ ‘) прекрасно описывает использование специальных символов. Пожалуйста, ознакомьтесь с ней в случае, если вы не знакомы с использованием этих специальных символов в скриптах оболочки. Ниже приведено краткое объяснение использования некоторых из них.

Двойные кавычки используются главным образом для объединения нескольких слов в строку и сохранения в ней пробелов. Например, «Эта строка содержит пробелы». Строка, заключенная в двойные кавычки рассматривается как единое целое. Например:

$ mkdir hello world

$ ls -F

hello/ world/

Здесь мы создали две директории. Команда mkdir принимает два слова hello и world, как два отдельных аргумента, и поэтому создает два каталога. Теперь посмотрим, а что произойдет, если написать код таким образом:

$ mkdir “hello world”

$ ls -F

hello/ hello world/ world/

Команда создала каталог с именем из двух слов. Кавычки объединили два слова в один аргумент[12].

Одинарные кавычки в основном используются для работы с переменными. Если переменная находится в двойных кавычках, то к ней можно обратиться через $имя_переменной. Если переменная находится в одинарных кавычках — это не возможно. Чтобы пояснить это приведем пример:

#!/bin/bash

x=5 # задаем х равным 5

# используем двойные кавычки

echo "Используем двойные кавычки, значение х равно $х"

# используем одинарные кавычки

echo 'Используем одинарные кавычки, значение х равно $х'

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

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*