Программим на Shell-е
Юниксовый 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 - перенаправление дескриптора с номером 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.
Удачи в программировании.
Источник: неизвестен