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

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


introduction_to_shell_scripts

Введение в сценарии оболочки

Основы сценариев оболочки

Сценарии оболочки Bourne shell обычно начинаются с приведенной ниже строки, которая указывает на то, что инструкции в файле сценария должна выполнять команда /bin/sh.

#! в англоязычных источниках называется shebang

Кавычки и литералы

Литералы

литерал — строка, которую оболочка должна в неизмененном виде передать в командную строку.

Одинарные кавычки

Простейший способ создать литерал и сделать так, чтобы оболочка его не трогала, — поместить всю строку в одинарные кавычки, как в следующем примере с командой grep и символом *:

$ grep 'r.*t' /etc/passwd

Двойные кавычки

Двойные кавычки («) действуют подобно одинарным, за исключением того, что оболочка развертывает все переменные, которые появляются внутри двойных кавычек.

Специальные переменные

Индивидуальные аргументы: $1, $2...

$1,$2 … являются позиционными переменными передаваемыми скрипту в качестве параметра.

Количество аргументов: $#

Переменная $# хранит количество аргументов, переданных в сценарий.

Все аргументы: $@

Переменная $@ представляет все аргументы сценария.

Имя сценария: $0

Переменная $0 хранит имя сценария.

Идентификатор процесса: $$

Переменная $$ хранит идентификатор процесса оболочки.

Код выхода: $?

Переменная $? хранит код выхода последней команды, которую выполнила оболочка.
Успешно завершившая работу команда вернет значение 0, а команда с ошибкой вернет значение 1.

Условные операторы

#!/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

[ $1 = «hi» ], используется символ [, который представляет реальную команду Unix, а не специальный синтаксис оболочки. Во всех системах Unix есть команда [, которая выполняет проверку условных операторов сценария оболочки. Эта команда известна также как test. При тщательном исследовании команд [ и test выясняется, что они совместно используют один и тот же дескриптор inode, то есть одна из них является символической ссылкой на другую.

Немного о пустом списке параметров

При отсутствии параметра команда тестирования прочитает [ = hi ], и тогда команда [ прервет исполнение, выдав ошибку. Этого можно избежать, если заключить параметр в кавычки одним из приведенных ниже способов (оба являются общепринятыми):

if [ "$1" = hi ]; then
if [ x"$1" = x"hi" ]; then

Использование других команд для проверки условий

Существует множество возможностей применять другие команды вместо [. Вот пример, в котором использована команда grep:

#!/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

Логические конструкции && и ||

Существуют две простые однострочные конструкции, которые могут вам время от времени встречаться: && («и») и || («или»).

command1 && command2

Здесь оболочка запускает команду command1, и если ее код выхода равен 0, оболочка запускает также и команду command2. Конструкция || подобна первой: если команда, расположенная перед символами ||, возвращает ненулевой код выхода, оболочка запускает вторую команду.

Проверка условий

Следующая строка проверяет, является ли файл file обычным файлом (а не каталогом или специальным файлом):

[ -f file ]

Можно выполнить инверсию условия, поместив оператор ! перед аргументами команды проверки. Например, условие [ ! –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Исполняемый
-uSetuid
-gSetgid
-k«Закрепленный»

Проверка строк

  • -z — возвращает значение true, если его аргумент пустой (условие [ -z »« ] возвратит значение 0);
  • -n — возвращает значение true, если его аргумент непустой (условие [ -n »« ] возвратит значение 1).

Арифметическая проверка

ОператорВозвращает значение true, если первый аргумент …
-eq…равен второму
-ne…не равен второму
-lt…меньше второго
-gt…больше второго
-le…меньше второго или равен ему
-ge…больше второго или равен ему

Сопоставление строк с помощью конструкции case

Ключевое слово case формирует еще одну условную конструкцию, которая чрезвычайно полезна при сопоставлении строк. Условный оператор case не выполняет никаких команд проверки и, следовательно, не выдает никаких кодов выхода. Тем не менее он может проверять соответствие шаблону.

#!/bin/sh
case $1 in
bye)
echo Fine, bye.
;;
hi|hello)
echo Nice to see you.
;;
what*)
echo Whatever.
;;
*)
echo 'Huh?'
;;
esac

Циклы

Цикл for

#!/bin/sh
for str in one two three four; do
echo $str
done

Цикл while

Цикл while в оболочке Bourne shell использует коды выхода, подобно условному оператору if. Например, такой сценарий выполняет десять итераций:

#!/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

Можно выйти из цикла while с помощью инструкции break. В оболочке Bourne shell есть также цикл until, который действует подобно циклу while, за исключением того, что он завершается, когда встречает нулевой код выхода, а не код, не равный 0. Однако не следует использовать слишком часто циклы while и until. В действительности, если вам необходимо применить цикл while, возможно, лучше воспользоваться языком awk или Python.

introduction_to_shell_scripts.txt · Последние изменения: 2016/01/21 04:48 — sander