Юниксовый Bourne Shell (/bin/sh) является не только стандартным интерфейсом твоего пристанища на *nix, но и замечательным средством для программирования. С помощью sh-скриптов можно с лёгкостью решить сложнейшие задачи в несколько строк текста. Если ты работаешь под Win32, то порядок составления скриптов чем-то напоминает написание BAT файлов, но не копирует его. Многочисленные параметры значительно облегчают работу с составлением скриптов, в чём ты сам
убедишься, прочитав эту статью. Здесь я изложу лишь азы, с помощью которых ты сможешь разбираться в чужих sh-скриптах и с успехом составлять свои.

Итак, приступим.

Как и в perl-скриптах, начало скрипта начинается с полного пути к интерпретатору, этот путь в нашем случае будет #!/bin/sh - путь к шелл-интерпретатору.

Переменные

В скрипте Shell можно использовать переменные. Самый простой способ присвоения значения переменной - написать следующее:

perem=value

При этом переменная perem получит значение value. Значением переменной можно воспользоваться в виде $perem. Чтобы отделить имя переменной от следующих символов, применяется
${perem}. Приятной особенностью Shell является то, что в переменную можно поместить вывод любой команды. Для этого используются обратные кавычки (``) и следующий формат:

perem=`command`

Например, чтобы поместить в архив все файлы, новее oldfile, используется команда:

tar czf new.tgz `find . newer oldfile -print`

Если строку завершить символом "амперсенд" (&), то Shell не будет ждать завершения команды, а отправит её в background (фоновый режим). Если же ты хочешь выполнить другой shell-скрипт в текущем, то просто вставь команду в скрипт:

./path/to/other/script

В Shell содержатся встроенные переменные, которые значительно упрощают написание скриптов. Рассмотрим некоторые из них:

$0 - название скрипта
$1,$2,...,$n - параметры, переданные скрипту
$# - число параметров, переданных скрипту
$? - код возврата последнего процесса
$$ - PID текущего процесса (PID - номер процесса в таблице процессов)
$! - PID последнего процесса, запущенного в фоновом режиме
$@ - список параметров, переданных скрипту
$* - все параметры единой строкой

Встроенные параметры значительно упрощают всю сложность задач. Пример: проверка существования пользователя $username в системе:

#!/bin/sh
grep $username /etc/passwd >/dev/null
if [ $? -ne 0 ]
then
echo Пользователь не найден
exit 1
fi

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

Перенаправление ввода/вывода

Существует 3 стандартных файловых дескриптора: ввод, вывод и вывод ошибки (stdin, stdout, stderr), но Shell позволяет открывать и другие потоки вывода. Рассмотрим их:

>file - перенаправление стандартного вывода (далее: stdout) в файл file
>>file - перенаправление stdout для дозаписи в файл file
<file - перенаправление стандартного ввода (далее: stdin) из файла file
proc1|proc2 - перенаправление stdout процесса proc1 на stdin процесса proc2
n>file - перенаправление дескриптора с номером n в файл file
n>>file - то же с дозаписью
n1>&n2 - слияние потоков с дескрипторами n1 и n2
<<string - ввод до подстроки string ("Ввод здесь").

Форму перенаправления "Ввод здесь" очень удобно использовать. Пример:

mail -s "Hello" << TheEnd <message.txt
root@localhost
mail1@mail.ru
mail2@mail.ru
mail3@mail.ru
TheEnd

Условия.

Для условия используется конструкция if..fi. Её формат такой:

if условие
then
команда1
.....
командаN
[elif условие
......]
[else условие
......]
fi

Условие может быть любой командой, например

if grep vasya /etc/passwd >/dev/null 2>&1 ;
then echo Пользователь опознан ;
fi

Циклы

Циклы в Shell бывают следующие: while, until и for.

Цикл while выполняется, пока условие истинно, например:

while условие
do
команды
done

Цикл until - пока условие ложно. For - для всех элементов списка:

for переменная in список
do
команды
done

Пример массовой рассылки (mess.txt) всех пользователей из файла user.txt, за исключением тех, кто есть в файле stop.txt:

for user in `cat users.txt` do
if grep $user stop.txt>/dev/null 2>&1
then
echo Skip $user
else mail -s "Рассылка" $user <message.txt
fi
done

Выбор.

За выбором следит оператор case. Его использование:

case значение in
шаблон1)
команды1
;;
шаблон2)
команды2
;;
....
*)
команды
;;
esac

Шаблоны могут включать в себя выражения, содержащие *, ? и [abc]. Иногда это бывает очень полезно.

Вот и всё. Это общая информация по Shell скриптам. Другие возможности желаешь? man sh or RTFM.

Удачи в программировании.

Check Also

KRACK на практике. Как работает атака на Wi-Fi с применением нашумевшей техники

Осенью 2017 года мир узнал о новой угрозе безопасности сетей Wi-Fi. Она затрагивает абсолю…

Оставить мнение