24.05.2011

Основы Shell Script. Часть I.

Операционные системы семейства Unix содержат такой удобный инструмент как shell script, с помощью которого можно решать множество задач, не прибегая к "настоящему" программированию. Ведь shell script - не что иное, как интерпретируемый язык программирования. В Unix по умолчанию используется, собственно, интерпретатор sh, в Linux - по умолчанию bash - его более функциональный аналог. Не ставя задачей привести исчерпывающее описание этого языка, а тем более всего множества команд, хотелось бы кратко рассмотреть те основы, которые нужны для практического использования. Итак, скрипт написанный на shell - это просто список команд определенной структуры, которые будут выполнены интерпретатором. Каждая команда - отдельный исполняемый файл, который вызывается командной оболочкой. Элементарный пример:
#!/bin/sh 
echo "Hello world!"
Комментарии начинаются с символа #. Экранирование строк осуществляется с помощью "" или ''.Если строка не содержит пробелов, в этом нет необходимости. Для того, чтобы выполнить скрипт, следует сделать файл исполняемым: 
chmod +x hello.sh
Однако можно (хотя как правило, так не делается) выполнить скрипт и не делая файл исполняемым, вызвав интерпретатор явно:
sh hello.sh или так sh < hello.sh
Группировка команд.
Последовательно идущие команды в сценарии разделяются переходом на новую строку или символом ; Кроме этого, произвольное количество команд можно группировать следующим образом:
& - асинхронное выполнение команд.
&& - выполнение последующей команды, в случае успешного завершения предыдущей.
|| - выполнение команды, в случае неудачного завершения предыдущей.
 
Несколько команд можно объединить в скобки - {} или () 
#!/bin/sh ls /dev/da0s1 && mount_ntfs /dev/da0s1 ./mnt cat ./text1 
& rm /tmp/temp ls /dev/da0s1 || { echo "Not found!"; rm ./buffer.txt; }
Сначала выполняется команда ls /dev/da0s1, и в том случае, если файл /dev/da0s1 существует - выполнится команда mount_ntfs /dev/da0s1 ./mnt. Следующие две команды выполнятся асинхронно, так как между ними помещен символ &. И, наконец, команды echo "Not found!" и rm ./buffer.txt выполняться последовательно в том случае, если файла /dev/da0s1 не существует.  Если бы вместо фигурных скобок были обычные — то команды, помещенные внутри этих скобок,выполнялись бы в отдельном экземпляре sh. 
 
Перенаправление ввода/вывода и конвейер. 
По умолчанию, вывод и ввод данных осуществляется через терминал (stdout – стандартный вывод, stdin – стандартный ввод, stderr – сообщения об ошибках). С помощью > и >> можно перенаправить вывод в файл.
ls ./ > result.txt 
Список файлов и каталогов в текущей директории будет помещен в файл result.txt. Если файл result.txt не существует, он будет создан, если существует — перезаписан. Если использовать >> - то вывод будет добавлен к уже существующему содержимому файла (файл не будет перезаписан). Аналогично, с помощью симоволов < и << , можно перенаправить и ввод: sort < input.txt > output.txt Строки из файла input.txt будут отсортированы в алфавитном порядке, а результат будет выведен в файл output.txt. Конвейером называется перенаправление стандартного вывода одной команды на стандартный ввод другой и обозначается символом |
ps ax | egrep gnome 
Эта команда выведет список процессов, в имени которых есть строка gnome. Разумеется, можно создавать конвейер не только из двух команд.
 
Переменные
Переменные в shell - это строки (и текстовые файлы).  
var=10 
Переменная var содержит строку 10 (не число). Вообще есть три способа присвоить значение переменной. 
1) Непосредственно, как было показано выше: var=value  
2) Результат выполнения команды, заключенной в обратные кавычки, станет значением переменной: var=`command`  
3) Ввести значение переменной с клавиатуры: read var Для того, чтобы использовать переменную после объявления, необходимо использовать символ $ Для того чтобы имя переменной не сливалось со строкой, используются фигурные скобки, например, в подобном случае:
echo ${x}something
Как было сказано выше, переменные — это строки. Но строки можно интерпретировать и как числа, если это необходимо. Например, для выполнения арифметических действий используется команда expr:
#!/bin/sh a=25 b=25 c=`expr $a + $b` 
В результате, значением переменной c станет строка 50. Знак умножения необходимо экранировать - '*'. Кроме собственных переменных, есть стандартные, наиболее важные из них:
 
$# количество параметров командной строки, переданных сценарию 
$0 … $n параметры командной строки, $0 – имя данного сценария 
$* параметры, как одна строка 
$? код завершения последней команды (код успешного завершения 0)
В следующей части будут рассмотрены операторы if, case, циклы и функции. Множество команд (unix/linux) с описанием можно найти здесь. 

 



Теги: shell Unix

comments powered by Disqus