1.2 Написание bash-скриптов
Shell - это командная оболочка. Но это не просто промежуточное звено между пользователем и операционой системой, это еще и мощный язык программирования. Программы на языке shell называют сценариями, или скриптами. Фактически, из скриптов доступен полный набор команд, утилит и программ UNIX. Если этого недостаточно, то есть внутренние команды shell - условные операторы, операторы циклов и пр.
В начале написания имеется необходимость явно указать интерпретатору команд директорию, из которой Bash будет вызван при запуске скрипта и сам его "загрузчик". Для этого наберем следующую команду в терминале:
user@localhost:~$ which bash /bin/bash |
Каждый файл сценария начинается с последовательности #!, это указывает системе, какой интерпретатор следует использовать для исполнения сценария. Это двухбайтовая последовательность, или - специальный маркер, определяющий тип сценария. Более точно, он определяет интерпретатор, который вызывается для исполнения сценария, это может быть командная оболочка (shell), иной интерпретатор или утилита.
#!/bin/sh
#!/bin/bash
#!/usr/bin/perl
#!/usr/bin/tcl
#!/bin/sed -f
#!/usr/awk -f
После указания пути к интерпретатору записывается последовательность команд.
Для примера создадим скрипт с именем example.sh следующего содержания (после символа # пишутся комментарии)
#!/bin/bash # объявляем переменную STRING STRING="Program work!" # вывод на экран echo $STRING |
При объявлении переменной знак $ перед ее обозначением не ставится.
Скрипт готов, теперь необходимо его запустить. Переходим в директорию, в которой был создан наш example.sh и сделаем файл исполняемым (иначе скрипт не сможет запуститься!):
$ chmod +x example.sh |
Права записываются сразу для трёх типов пользователей: владельца-пользователя файла, пользователей, входящих в группу-владелец и для прочих пользователей. Аргумент команды chmod, задающий разрешения, может быть записан в двух форматах: в числовом и в символьном.
Для понимания сути задания прав в Unix-like системах, нужно знать представление чисел в восьмеричной и двоичной системах счисления
пользователь |
группа |
остальные |
7 |
5 |
5 |
111 |
101 |
101 |
rwx |
r-x |
r-x |
u |
g |
o |
Пример символьной записи: 'rwxr-xr-x'.
Примером числовой записи может служить '755', которая эквивалентна записанной выше строковой записи: каждое право имеет числовой код и может быть задано вручную:
400 — владелец имеет право на чтение;
200 — владелец имеет право на запись;
100 — владелец имеет право на выполнение;
40 — группа имеет право на чтение;
20 — группа имеет право на запись;
10 — группа имеет право на выполнение;
4 — остальные имеют право на чтение;
2 — остальные имеют право на запись;
1 — остальные имеют право на выполнение.
Суммировав эти коды можно получить символьную запись. Например, chmod 444 {имя файла}: 400+40+4=444 — все имеют право только на чтение.
Помимо стандартных 'rwx' значений команда CHMOD осуществляет ещё управление битами SGID, SUID и T. Установленные атрибуты SUID или SGID позволяют запускать файл на выполнение с правами владельца файла или группы соответственно.
Для SUID — вес 4000, а для SGID — 2000.
Пример chmod 4555 {имя файла} — все имеют право на чтение и выполнение, но запускаться файл на исполнение будет с правами владельца. Для директории: установка SGID приведёт к установке принадлежности каждого нового создаваемого файла к той же группе, к которой принадлежит сама директория, а не к основной группе владельца, как это происходит по умолчанию. SUID для директории не имеет смысла.
t-бит используется с директориями. Когда t-бит для директории не установлен, файл в данной директории может удалить любой пользователь, имеющий доступ на запись к данному файлу. Устанавливая t-бит на директорию, мы меняем это правило таким образом, что удалить файл может только владелец этого файла. Следуя приведённой выше кодировке, t-бит имеет вес 1000.
Команда > перезаписывает файл, команда >> добавляет информацию в конец файла.
Сохраним значение переменной в файл. Для этого создадим файл
>data.txt |
Запишем в него
echo $STRING >> data.txt |
В данном случае в конец файла добавляем содержимое переменной $STRING.
Отобразить содержимое файла можно следующим образом
cat data.txt |