Инструменты пользователя

Инструменты сайта


introduction_to_shell_scripts

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

introduction_to_shell_scripts [2016/01/21 04:48] (текущий)
sander создано
Строка 1: Строка 1:
 +====== Введение в сценарии оболочки ======
 +===== Основы сценариев оболочки =====
 +Сценарии оболочки **Bourne shell** обычно начинаются с приведенной ниже строки,​ которая указывает на то, что инструкции в файле сценария должна выполнять команда /bin/sh.
 +<WRAP center round tip 60%>
 +#! в англоязычных источниках называется shebang
 +</​WRAP>​
 +===== Кавычки и литералы =====
 +==== Литералы ====
 +литерал — строка,​ которую оболочка должна в неизмененном виде передать в командную строку.
 +==== Одинарные кавычки ====
 +Простейший способ создать литерал и сделать так, чтобы оболочка его не трогала,​ — поместить всю строку в одинарные кавычки,​ как в следующем примере с командой grep и символом *:
 +<code bash>
 +$ grep '​r.*t'​ /etc/passwd
 +</​code>​
 +==== Двойные кавычки ====
 +Двойные кавычки (") действуют подобно одинарным,​ за исключением того, что оболочка развертывает все переменные,​ которые появляются внутри двойных кавычек.
 +===== Специальные переменные =====
 +==== Индивидуальные аргументы:​ $1, $2... ====
 +$1,$2 ... являются позиционными переменными передаваемыми скрипту в качестве параметра.
 +==== Количество аргументов:​ $# ====
 +Переменная $# хранит количество аргументов,​ переданных в сценарий.
 +==== Все аргументы:​ $@ ====
 +Переменная $@ представляет все аргументы сценария.
 +==== Имя сценария:​ $0 ====
 +Переменная $0 хранит имя сценария.
 +==== Идентификатор процесса:​ $$ ====
 +Переменная $$ хранит идентификатор процесса оболочки.
 +==== Код выхода:​ $? ====
 +Переменная $? хранит код выхода последней команды,​ которую выполнила оболочка.\\
 +Успешно завершившая работу команда вернет значение 0, а команда с ошибкой вернет значение 1.
 +===== Условные операторы =====
 +<code bash>
 +#!/bin/sh
 +if [ $1 = hi ]; then
 +echo 'The first argument was "​hi"'​
 +else
 +echo -n 'The first argument was not "​hi"​ -- '
 +echo It was '"'​$1'"'​
 +fi
 +</​code>​
 +<WRAP center round info 80%>
 +**[ $1 = "​hi"​ ]**, используется символ **[**, который представляет реальную команду Unix, а не специальный синтаксис оболочки. Во всех системах Unix есть команда **[**, которая выполняет проверку условных операторов сценария оболочки. Эта команда известна также как **test**. При тщательном исследовании команд **[** и **test** выясняется,​ что они совместно используют один и тот же дескриптор inode, то есть одна из них является символической ссылкой на другую.
 +</​WRAP>​
 +==== Немного о пустом списке параметров ====
 +При отсутствии параметра команда тестирования прочитает [ = hi ], и тогда команда [ прервет исполнение,​ выдав ошибку. Этого можно избежать,​ если заключить параметр в кавычки одним из приведенных ниже способов (оба являются общепринятыми):​
 +<code bash>
 +if [ "​$1"​ = hi ]; then
 +if [ x"​$1"​ = x"​hi"​ ]; then
 +</​code>​
 +==== Использование других команд для проверки условий ====
 +Существует множество возможностей применять другие команды вместо [. Вот пример,​ в котором использована команда grep:
 +<code bash>
 +#!/bin/sh
 +if grep -q daemon /​etc/​passwd;​ then
 +echo The daemon user is in the passwd file.
 +else
 +echo There is a big problem. daemon is not in the passwd file.
 +fi
 +</​code>​
 +==== Логические конструкции && и || ====
 +Существуют две простые однострочные конструкции,​ которые могут вам время от времени встречаться:​ && («и») и || («или»).
 +<code bash>
 +command1 && command2
 +</​code>​
 +Здесь оболочка запускает команду command1, и если ее код выхода равен 0, оболочка запускает также и команду command2. Конструкция || подобна первой:​ если команда,​ расположенная перед символами ||, возвращает ненулевой код выхода,​ оболочка запускает вторую команду.
 +==== Проверка условий ====
 +Следующая строка проверяет,​ является ли файл file обычным файлом (а не каталогом или специальным файлом):​
 +<code bash>
 +[ -f file ]
 +</​code>​
 +Можно выполнить инверсию условия,​ поместив оператор **!** перед аргументами команды проверки. Например,​ условие **[ ! –f file ]** возвращает значение true, если файл file не является обычным файлом. Кроме того, флаги -a и -o являются логическими операторами «и» и «или» (например,​ [ -f file1 –a file2 ]).
 +==== Проверка файлов ====
 +Вот две важные проверки файлов:​
 +  * -e — возвращает значение true, если файл существует;​
 +  * -s — возвращает значение true, если файл непyстой.
 +
 +**Операторы проверки типа файла**
 +|Оператор|Условие проверки|
 +|-f|Обычный файл|
 +|-d|Каталог|
 +|-h|Символическая ссылка|
 +|-b|Блочное устройство|
 +|-c|Символьное устройство|
 +|-p|Именованный канал|
 +|-s|Сокет|
 +
 +**Операторы проверки прав доступа к файлу**
 +|Оператор|Оператор|
 +|-r|Для чтения|
 +|-w|Для записи|
 +|-x|Исполняемый|
 +|-u|Setuid|
 +|-g|Setgid|
 +|-k|«Закрепленный»|
 +
 +**Проверка строк**
 +  * -z — возвращает значение true, если его аргумент пустой (условие [ -z ""​ ] возвратит значение 0);
 +  * -n — возвращает значение true, если его аргумент непустой (условие [ -n ""​ ] возвратит значение 1).
 +
 +**Арифметическая проверка**
 +|Оператор|Возвращает значение true, если первый аргумент …|
 +|-eq|…равен второму|
 +|-ne|…не равен второму|
 +|-lt|…меньше второго|
 +|-gt|…больше второго|
 +|-le|…меньше второго или равен ему|
 +|-ge|…больше второго или равен ему|
 +
 +===== Сопоставление строк с помощью конструкции case =====
 +<WRAP center round info 80%>
 +Ключевое слово **case** формирует еще одну условную конструкцию,​ которая чрезвычайно полезна при сопоставлении строк. Условный оператор case не выполняет никаких команд проверки и, следовательно,​ не выдает никаких кодов выхода. Тем не менее он может проверять соответствие шаблону.
 +</​WRAP>​
 +
 +<code bash>
 +#!/bin/sh
 +case $1 in
 +bye)
 +echo Fine, bye.
 +;;
 +hi|hello)
 +echo Nice to see you.
 +;;
 +what*)
 +echo Whatever.
 +;;
 +*)
 +echo '​Huh?'​
 +;;
 +esac
 +</​code>​
 +
 +====== Циклы ======
 +===== Цикл for =====
 +<code bash>
 +#!/bin/sh
 +for str in one two three four; do
 +echo $str
 +done
 +</​code>​
 +===== Цикл while =====
 +Цикл while в оболочке Bourne shell использует коды выхода,​ подобно условному оператору if. Например,​ такой сценарий выполняет десять итераций:​
 +<code bash>
 +#!/bin/sh
 +FILE=/​tmp/​whiletest.$$;​
 +echo firstline > $FILE
 +while tail -10 $FILE | grep -q firstline; do
 +    # add lines to $FILE until tail -10 $FILE no longer prints "​firstline"​
 +    echo -n Number of lines in $FILE:'​ '
 +    wc -l $FILE | awk '​{print $1}'
 +    echo newline >> $FILE
 +done
 +rm -f $FILE
 +</​code>​
 +
 +<WRAP center round info 80%>
 +Можно выйти из цикла while с помощью инструкции break. В оболочке Bourne shell есть также цикл until, который действует подобно циклу while, за исключением того, что он завершается,​ когда встречает нулевой код выхода,​ а не код, не равный 0. Однако не следует использовать слишком часто циклы while и until. В действительности,​ если вам необходимо применить цикл while, возможно,​ лучше воспользоваться языком awk или Python.
 +</​WRAP>​
  
introduction_to_shell_scripts.txt · Последние изменения: 2016/01/21 04:48 — sander