Спец курс (Автоматизация процесса проектирования)/Лекция 1 (BASH)
Содержание |
Введение
Название BASH -- это аббревиатура от "Bourne-Again Shell" и игра слов от, ставшего уже классикой, "Bourne Shell" Стефена Бурна (Stephen Bourne). В последние годы BASH достиг такой популярности, что стал стандартной командной оболочкой de facto для многих разновидностей UNIX. Большинство принципов программирования на BASH одинаково хорошо применимы и в других командных оболочках, таких как Korn Shell (ksh), от которой Bash позаимствовал некоторые особенности, [2] и C Shell и его производных. (Примечательно, что C Shell не рекомендуется к использованию из-за отдельных проблем, отмеченных Томом Кристиансеном (Tom Christiansen) в октябре 1993 года на Usenet post
Первый скрипт
- Создаем файл first_script.sh
- Даем файлу права на запуск ( chmod 755 first_script.sh )
- Содержимое файла
#!/bin/bash echo "hello world"
Заголовок скрипта и комментарии
В shell-скриптах последовательность #! должна стоять самой первой и задает интерпретатор (sh или bash). Интерпретатор, в свою очередь, воспринимает эту строку как комментарий, поскольку она начинается с символа #. Если в сценарии имеются еще такие же строки, то они воспринимаются как обычный комментарий.
#!/bin/bash
Оператор echo
Для вывода текстовых сообщений или инофрмации в поток вывода используется оператор echo
#!/bin/bash echo "Имя скрипта — \$0" echo "Первый аргумент: \$1" echo "Второй аргумент: \${2}" echo "Семнадцатый аргумент: \${17}" echo "Количество аргументов: \$#"
Переменные
- Переменные -- это одна из основ любого языка программирования. Они учавствуют в арифметических операциях, в синтаксическом анализе строк и совершенно необходимы для абстрагирования каких либо величин с помощью символических имен. Физически переменные представляют собой ни что иное как участки памяти, в которые записана некоторая информация.
- В отличие от большинства других языков программирования, Bash не производит разделения переменных по "типам". По сути, переменные Bash являются строковыми переменными, но, в зависимости от контекста, Bash допускает целочисленную арифметику с переменными. Определяющим фактором здесь служит содержимое переменных.
Бремя отслеживания типа той или иной переменной полностью лежит на плечах программиста. Bash не будет делать это за вас!
- Для объявления переменной нужно указать ее имя и задать значение.
#!/bin/bash # Присваивание значений переменным a=375
- Чтобы использовать значение переменной используют специальный символ $
#!/bin/bash # Присваивание значений переменным и подстановка значений переменных a=375 hello=$a
- Использование пробельных символов с обеих сторон символа "=" присваивания недопустимо.
- Если записать "VARIABLE =value", то интерпретатор попытается выполнить команду "VARIABLE" с параметром "=value".
- Если записать "VARIABLE= value", то интерпретатор попытается установить переменную окружения "VARIABLE" в "" и выполнить команду "value".
- Примечательно, что написание $variable фактически является упрощенной формой написания ${variable}
#!/bin/bash hello='hello' echo hello # Это не ссылка на переменную, выведет строку "hello". echo $hello echo ${hello} # Идентично предыдущей строке. echo "$hello" echo "${hello}"
- Если в значениях переменных встречаются пробелы, то использование кавычек обязательно.
#!/bin/bash numbers="один два три" other_numbers="1 2 3" echo "numbers = $numbers" echo "other_numbers = $other_numbers" # other_numbers = 1 2 3
- Неинициализированная переменная хранит "пустое" значение - не ноль!. Объявление неинициализированной переменной (то же, что и присваивание пустого значения, см. выше).
#!/bin/bash echo "uninitialized_variable = $uninitialized_variable" uninitialized_variable= echo "uninitialized_variable = $uninitialized_variable" uninitialized_variable=23 echo "uninitialized_variable = $uninitialized_variable"
- Использование неинициализированных переменных может приводить к ошибкам разного рода в процессе исполнения.
- Оператор unset используется для того, чтобы инициализированную переменную сделать не инициализированной
#!/bin/bash uninitialized_variable=23 # Присваивание. unset uninitialized_variable # Сброс. echo "uninitialized_variable = $uninitialized_variable" # Переменная содержит "пустое" значение.
Присваивание значений переменным
- '=' оператор присваивания (пробельные символы до и после оператора -- недопустимы)
#!/bin/bash a=879 echo "Значение переменной \"a\" -- $a."
- Можно использовать присваивание совместно с оператором let
#!/bin/bash let a=16+5 echo "Значение переменной \"a\" теперь стало равным: $a."
- Неявное присваивание
#!/bin/bash echo -n "Значения переменной \"a\" в цикле: " for a in 7 8 9 11 do echo -n "$a " done
- Присваивание с оператором read
#!/bin/bash echo -n "Введите значение переменной \"a\" " read a echo "Значение переменной \"a\" теперь стало равным: $a."
- Присваивание переменным переменных
#!/bin/bash a=23 # Простейший случай echo $a b=$a echo $b
- Маскированное присваивание переменных с использованием обратных ковычек `...`
#!/bin/bash a=`echo Hello!` # В переменную 'a' попадает результат работы команды 'echo' echo $a a=`ls -l` # В переменную 'a' записывается результат работы команды 'ls -l' echo $a # Кавычки отсутствуют, удаляются лишние пробелы и пустые строки. echo echo "$a" # Переменная в кавычках, все пробелы и пустые строки сохраняются.
- Маскированное присваивание переменных с использованием $(...) (более современный метод, по сравнению с обратными кавычками)
#!/bin/bash a=$(echo Hello\!) # В переменную 'a' попадает результат работы команды 'echo' echo $a
Переменные Bash не имеют типов
- Тип переменной определяется из контекса
#!/bin/bash a=2334 # Целое число. let "a += 1" echo "a = $a " # a = 2335 echo # Все еще целое число. b=${a/23/BB} # замена "23" на "BB". # Происходит трансформация числа в строку. echo "b = $b" # b = BB35 declare -i b # Явное указание типа здесь не поможет. echo "b = $b" # b = BB35 let "b += 1" # BB35 + 1 = echo "b = $b" # b = 1 echo c=BB34 echo "c = $c" # c = BB34 d=${c/BB/23} # замена "BB" на "23". # Переменная $d становится целочисленной. echo "d = $d" # d = 2334 let "d += 1" # 2334 + 1 = echo "d = $d" # d = 2335
- Пустая переменная становиться целочисленной
#!/bin/bash e="" echo "e = $e" # e = let "e += 1" # Арифметические операции допускают использование "пустых" переменных? echo "e = $e" # e = 1
- Необъявленная переменная трансформируется в целочисленную.
#!/bin/bash echo "f = $f" # f = let "f += 1" # Арифметические операции допустимы? echo "f = $f" # f = 1
Использование ковычек в значения переменных
- Кавычки, ограничивающие строки с обеих сторон, служат для предотвращения интерпретации специальных символов, которые могут находиться в строке.
(Символ называется "специальным", если он несет дополнительную смысловую нагрузку, например символ шаблона -- *.)
- Желательно использовать двойные кавычки (" ") при обращении к переменным. Это предотвратит интерпретацию специальных символов, которые могут содержаться в именах переменных, за исключением $, ` (обратная кавычка) и \ (escape -- обратный слэш).
- То, что символ $ попал в разряд исключений, позволяет выполнять обращение к переменным внутри строк, ограниченных двойными кавычками ("$variable"), т.е. выполнять подстановку значений переменных.
- Двойные кавычки могут быть использованы для предотвращения разбиения строки на слова. Заключение строки в кавычки приводит к тому, что она передается как один аргумент, даже если она содержит пробельные символы - разделители.
variable1="a variable containing five words" COMMAND This is $variable1 # Исполнение COMMAND с 7 входными аргументами: # "This" "is" "a" "variable" "containing" "five" "words" COMMAND "This is $variable1" # Исполнение COMMAND с одним входным аргументом: # "This is a variable containing five words" variable2="" # Пустая переменная. COMMAND $variable2 $variable2 $variable2 # Исполнение COMMAND без аргументов. COMMAND "$variable2" "$variable2" "$variable2" # Исполнение COMMAND с 3 "пустыми" аргументами. COMMAND "$variable2 $variable2 $variable2" # Исполнение COMMAND с 1 аргументом (и 2 пробелами).
Входные параметры
Код завершения и возвращаемое значение
- Команда exit может использоваться для завершения работы сценария, точно так же как и в программах на языке C. Кроме того, она может возвращать некоторое значение, которое может быть проанализировано вызывающим процессом.
- В соответствии с соглашениями, 'exit 0' указывает на успешное завершение, в то время как ненулевое значение означает ошибку.
#!/bin/bash echo hello echo $? # код возврата = 0, поскольку команда выполнилась успешно. lskdf # Несуществующая команда. echo $? # Ненулевой код возврата, поскольку команду выполнить не удалось. echo exit 113 # Явное указание кода возврата 113. # Проверить можно, если набрать в командной строке "echo $?" # после выполнения этого примера.