Шрифт:
Интервал:
Закладка:
$ mkdir 'hello world'
$ ls -F
hello world/
Обратные кавычки сильно отличаются от двойных и одинарных. Они не могут использоваться для сохранения пробелов. Если вы помните, выше мы использовали такую строку:
x=$(expr $x + 1)
Как вы уже знаете, результатом работы этой команды будет то, что выражение $х + 1 присваивается переменной x. Того же результата можно достичь и с использованием обратных кавычек:
x='expr $x + 1′
Какой тип кавычек лучше использовать? Тот, что вам больше нравится. Изучая скрипты вы найдете, что обратные кавычки используются чаще, чем запись $(…) . Тем не менее, я считаю, $ (…) легче читать, особенно если у вас код наподобие этого:
#!/bin/bash
echo “I am 'whoami'”[13]
Это только начало. Вы узнаете еще много чего интересного в заключительной части этой статьи[14]. А пока вы ее ждете - удачного вам написания скриптов...
Оригинал статьи Гарольда Родригеса
Для тех, кому невтерпеж, и кто считает, что справится с большим пособием: Advanced Bash-Scripting Guide (на русском)
Часть II
В второй статье Гарольд продолжает свое первоклассное введение в программирование на bash. На этот раз он объясняет, как выполнять арифметические операции и определять функции в bash-скриптах. Завершается статья введением в такие понятия как чтение пользовательского ввода, обработка скриптом аргументов, перехватывание сигналов и обработка кодов завершения программ.
Безусловно, результаты прочтения превзойдут все ожидания! После этой статьи вас уже нельзя будет назвать новичком. Ведь вы на пути к тому, чтоб называться мастером программирования на bash!
Арифметика и bash
Скриптовой язык bash позволяет выполнять арифметические операции. Как вы уже видели в предыдущей статье, арифметика выполняется с помощью команды expr. Однако, подобно команде true, этот вариант считается медленным. Причина кроется в том, что для использования true и expr оболочка должна предварительно запустить их. Лучше всего использовать встроенную в bash функцию, которая работает быстрее. Аналогично тому, что альтернативой true является команда":", альтернатива expr— заключение арифметического выражения в конструкцию вида$((...)). Будьте внимательны, она отличается от$(...). Отличие тут в количестве скобок. Так давайте же испробуем это:
#!/bin/bash
x=8 # присваиваем x значение 8
y=4 # присваиваем y значение 4
# результат сложения x и y сохраняем в z:
z=$(($x + $y))
echo "Сумма $x и $y равна $z"
Как обычно, выбор используемого метода вычислений за вами. Если использование expr для вас более комфортно и привычнее, чем $((...)), используйте его.
Скриптовой язык bash умеет выполнять сложение, вычитание, умножение, целочисленное деление и получение остатка от деления. Каждое арифметическое действие имеет соответствующий ему оператор:
Действие Оператор Сложение + Вычитание - Умножение * Целочисленное деление / Остаток от деления %Большинство из вас должно быть знакомо с первыми четырьмя операциями. Если вы не знаете, что такое деление по модулю, то это просто число равное остатку от деления одного целого числа на другое. Ниже приведен пример выполнения арифметических операций в bash:
#!/bin/bash
x=5 # устанавливаем x равным 5
y=3 # устанавливаем y равным 3
# сохраняем сумму x и y в переменную add
add=$(($x + $y))
# сохраняем разность x и y в переменную sub
sub=$(($x – $y))
# умножаем x на y и сохраняем результат в переменную mul
mul=$(($x * $y))
# в переменную div сохраняем результат деления x на y
div=$(($x / $y))
# получаем остаток от деления x на y и сохраняем его в переменную mod
mod=$(($x % $y))
# печатаем ответы
echo "Сумма равна: $add"
echo "Разность равна $sub"
echo "Произведение равно $mul"
echo "Результат деления $div"
echo "Остаток от деления $mod"
Код, приведенный выше, можно было бы написать с использованием expr. Например, вместо add=$(($x + $y)) мы могли бы использовать add=$(expr $x + $y)илиadd=`expr $x + $y`.
Чтение ввода пользователя
А теперь — самое интересное. Мы напишем свой скрипт так, что он будет взаимодействовать с пользователем, а пользователь с ним. Команда для получения данных от пользователя —read. Это встроенная в bash команда, сохраняющая ввод пользователя в указанной переменной:
#!/bin/bash
# спросить у пользователя его имя и поздороваться с ним
echo -n "Введите свое имя: "
read user_name
echo "Привет $user_name!"
Переменная здесь — это user_name. Конечно, мы могли бы назвать ее как угодно. Оператор read прервет выполнение скрипта и будет ждать, пока пользователь введет что-нибудь и нажмет клавишу ENTER. Если клавиша ENTER была нажата без ввода чего-либо, read запустит следующую строку кода. Попробуйте это сделать. Ниже приведен тот же пример, только на этот раз мы проверяем, вводит ли пользователь что-либо:
#!/bin/bash
# спрашиваем имя пользователя и выводим приветствие
echo -n "Введите имя: "
read user_name
# проверка ввода пользователя
if [ -z "$user_name" ]; then
echo "Вы не сказали мне свое имя!"
exit
fi
echo "Привет $user_name!"
В приведенном примере, если пользователь нажал ENTER и не ввел при этом ничего, наша программа напишет об этом и завершит свою работу. В противном случае она напечатает приветствие. Получение пользовательского ввода полезно для интерактивных программ, которые требуют от пользователя ввести какие-то данные.
Функции
Использование функций делает сопровождение своих скриптов проще. Проще говоря, это хороший способ разделить программу на более мелкие куски. Функция выполняет определенное действие и может возвращать то значение, какое вы пожелаете. Прежде чем продолжать, я приведу пример скрипта, написанного с использованием функции:
#!/bin/bash
# функция hello() печатает сообщение
hello(){
echo "Вы находитесь в функции hello()"
}
echo "Вызываем функцию hello()…"
hello
Попробуйте запустить код из примера выше. Функция hello() в нем имеет только одно предназначение — просто напечатать сообщение. Но, конечно же, они могут решать и более сложные задачи. Выше мы вызвали функцию hello(), используя строку:
hello
Когда запускается эта строка, bash ищет скрипт для строки hello(). Он находит его в начале файла и выполняет его содержимое. Функции всегда вызываются по своему имени, что мы и видели выше. При написании функции вы можете обьявить ее, просто указав имя_функции (), как это сделано выше, или если вы хотите сделать ее объявление более явным, можете объявить ее так: function имя_функции(). Ниже представлен альтернативный способ написания функции hello()
function hello() {
echo "Вы находитесь в функции hello()"
}
После имени функции должны следовать пустые открывающая и закрывающая скобки: "()", за ними следует пара фигурных скобок: «{…}», содержащих тело функции. Другими словами, весь код функции заключен в эти фигурные скобки. Функции всегда должны быть предварительно объявлены до своего вызова. Давайте попробуем в приведенном выше примере вызвать функцию до ее объявления:
#!/bin/bash
echo "Вызов функции hello() …"
hello
echo "Вы вне функции hello()"
# функция hello() просто выводит сообщение
hello(){
echo "Вы находитесь в функции hello()"
}
Вот что мы получим, когда попытаемся запустить этот скрипт:
$ ./hello.sh
Вызов функции hello() ...
./hello.sh: hello: command not found
Вы вне функции hello()
Как видите, мы получили сообщение об ошибке. Поэтому стоит всегда размещать ваши функции в начале кода или, по крайней мере, непосредственно перед вызовом функции.
Еще один пример использования функции:
#!/bin/bash
# admin.sh – инструмент для администратора
# функция new_user () создает новую учетную запись пользователя
new_user(){
echo "Подготовка к созданию новых пользователей ..."
sleep 2
# запускаем программу adduser adduser
- QT 4: программирование GUI на С++ - Жасмин Бланшет - Программирование
- Разработка ядра Linux - Роберт Лав - Программирование
- C# для профессионалов. Том II - Симон Робинсон - Программирование
- Программирование игр и головоломок - Жак Арсак - Программирование
- C# 4.0: полное руководство - Герберт Шилдт - Программирование
- Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT. Часть 2 - Александр Фролов - Программирование
- Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен - Программирование
- Программирование на Java - Н.А. Вязовик - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Графические интерфейсы пользователя Java - Тимур Сергеевич Машнин - Программирование