Ключевые слова:shell, howto, (найти похожие документы)
From: Докучаев Дмитрий <forb@k-uralsk.ru>
Subject: Bash-программированиеhttp://kamensk.net.ru/forb/info/linux/programm/bash.html
Bash-программирование
_________________________________________________________________
Юниксовый 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
;;
....
*)
команды
;;
ecas
Шаблоны могут включать в себя выражения, содержащие *, ? и [abc].
Иногда это бывает очень полезно.
Вот и всё. Это общая информация по Shell скриптам. Другие возможности
желаешь? man sh or RTFM.
http://kamensk.net.ru/forb/
"$@ - список параметров, переданных скрипту
$* - все параметры единой строкой"
типа одно и тоже? ;)
=======
"Встроенные параметры значительно упрощают всю сложность задач." - сложнопостигаемо, но блестяще закручено :)))
=======
"Существует 3 стандартных файловых дескриптора: ввод, вывод и вывод ошибки" - на самом деле дескриптор это число, т.е. существуют стандартные потоки в/в "ввод, вывод и вывод ошибки", которым соответствуют дескрипторы 0, 1 и 2.
=======
"<<file - перенаправление stdout для дозаписи в файл file" - если правильно, то будет так:
>>file
=======
">>string - ввод до подстроки string 'Ввод здесь'" - если правильно, то будет так:
<<string
=======
Пример:
mail -s "Hello" >> TheEnd >message.txt
root@localhost
mail1@mail.ru
mail2@mail.ru
mail3@mail.ru
TheEnd
ВООБЩЕ ВРЕДИТЕЛЬСКИЙ :-о !!!
=======
Пример:
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
ВООБЩЕ ДИВЕРСИЯ ПРОТИВ СОЗНАНИЯ :(((
ошибки + крайне нерациональное решение
=======