![]() |
Язык shell
Командный язык shell (в переводе - раковина, скорлупа) фактически есть язык программирования очень высокого уровня. На этом языке пользователь осуществляет управление компьютером. Обычно, после входа в систему вы начинаете взаимодействовать с командной оболочкой (если угодно - она начинает взаимодействовать с вами). Признаком того, что оболочка (shell) готова к приему команд служит выдаваемый ею на экран промптер. В простейшем случае это один доллар ("$").
Shell не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках POSIX [POSIX 1003.2] - стандарта мобильных систем). Например, немалой популярностью пользуется язык cshell, есть также kshell, bashell (из наиболее популярных в последнее время) и другие. Более того, каждый пользователь может создать свой командный язык. Может одновременно на одном экземпляре операционной системы работать с разными командными языками. 1. Основные понятия языка shell 1.1. Ввод-вывод Три направления ввода-вывода являются выделенными - стандартный ввод, стандартный вывод и стандартный протокол. Как правило, команды берут исходные данные из стандартного ввода и помещают результаты в стандартный вывод. Стандартные ввод, вывод и протокол можно переназначить. Обозначение Код:
< <имя файла>Код:
> <имя файла>Код:
<< <строка>Код:
>> <имя файла>Код:
<& <цифра>Код:
>& <цифра>Если любой из этих конструкций предшествует цифра, то с указанным файлом будет ассоциирован дескриптор, равный указанной цифре, вместо 0 и 1 по умолчанию. Например, Код:
2 > <имя файла>Код:
2 >& 1Код:
... 2>protocolЧтобы переназначить стандартный протокол туда же, куда уже назначен стандартный вывод, следует употребить конструкцию Код:
... 2>&1Код:
1 > xxx 2 >& 1Код:
2 >& 1 1 > xxxМожно переназначить системный ввод на текущий файл: Код:
isql - - <Обычно shell ждет завершения выполнения команды. Однако имеется возможность запустить задачу в асинхронном режиме, т.е. без ожидания ее завершения. Для этого после команды (после всех ее аргументов и указаний о переназначении ввода-вывода) надо поставить знак &. При этом по умолчанию стандартный ввод команды назначается на пустой файл /dev/null. Пример: создать файл primer можно по команде Код:
echo > primerКод:
time prog > prog.res 2> prog.tim &Конвейер - последовательность команд, разделенных знаком |. Если после конвейера стоит ; shell ждет его завершения. Если & - то не ждет. Роль ; может играть конец строки. Смысл конвейера в том, что стандартный вывод одной команды замыкается на стандартный ввод другой. Пример конвейера - подсчитать число об(r)ектных файлов в текущем каталоге. Код:
ls *.o | wc -lМетасимволы - символы, имеющие специальное значение для интерпретатора : Код:
? * ; & ( ) | ^ < > <пробел> <табуляция> <возврат_каретки>После всех подстановок в каждом слове команды ищутся символы *,?, и [. Если находится хотя бы один из них, то это слово рассматривается как шаблон имен файлов и заменяется именами файлов, удовлетворяющих данному шаблону (в алфавитном порядке). Если ни одно имя файла не удовлетворяет шаблону, то он остается неизменным. Значения указанных символов: Код:
* любая строка, включая и пустую 2. Синтаксис языка shell 2.1. Комментарии Строки, начинающиеся с #, трактуются как комментарии. 2.2. Подстановка результатов выполнения команд Выражения можно заключать в обратные кавычки (`). Такие выражения вычисляются в месте использования. Они могут быть, например, частью строк. Пример. Пусть параметром макрокоманды является имя файла с расширением .for. Требуется удалить одноименный файл с расширением .err. Код:
name=`ena -n $1`Код:
ena -n $12.3. Переменные и подстановка их значений Все переменные в языке shell - текстовые. Их имена должны начинаться с буквы и состоять из латинских букв, цифр и знака подчеркивания (_). Чтобы воспользоваться значением переменной, надо перед ней поставить символ $. Использование значения переменной называется подстановкой. Различается два класса переменных: позиционные и с именем. Позиционные переменные - это аргументы командных файлов, их именами служат цифры: $0 - имя команды, $1 - первый аргумент и т.д. Значения позиционным переменным могут быть присвоены и командой set (см. Специальные команды). Пример. После вызова программы на shellе, хранящейся в файле ficofl: Код:
ficofl -d / \*.forЕще две переменные хранят командную строку за исключением имени команды: $@ эквивалентно $1 $2 ..., а $* - "$1 $2 ...". Начальные значения переменным с именем могут быть установлены следующим образом: Код:
<имя>=<значение> [ <имя>=<значение> ] ...Код:
${<переменная>}Код:
${<переменная>:-<слово>}Код:
${<переменная>:=<слово>}Код:
${<переменная>:?<слово>}Код:
${<переменная>:+<слово>}Пример: если переменная d не определена или является пустой строкой, то выполняется команда pwd Код:
echo ${d:-`pwd`}Код:
# количество позиционных параметров (десятичное) Код:
echo $$Shell'ом используются следующие специальные переменные: Код:
HOME директория, в которую пользователь попадает при входе в систему или при выполнении команды cd без аргументов Код:
ляция> и <возврат_каретки>)3. Управляющие конструкции Простая команда - это последовательность слов, разделенная пробелами. Первое слово является именем команды, которая будет выполняться, а остальные будут переданы ей как аргументы. Имя команды передается ей как аргумент номер 0 (т.е. имя команды является значением $0). Значение, возвращаемое простой командой - это ее статус завершения, если она завершилась нормально, или (восьмеричное) 200+статус, если она завершилась аварийно. Список - это последовательность одного или нескольких конвейеров, разделенных символами ;, &, && или || и быть может заканчивающаяся символом ; или &. Из четырех указанных операций ; и & имеют равные приоритеты, меньшие, чем у && и ||. Приоритеты последних также равны между собой. Символ ; означает, что конвейеры будут выполняться последовательно, а & - параллельно. Операция && (||) означает, что список, следующий за ней будет выполняться лишь в том случае, если код завершения предыдущего конвейера нулевой (ненулевой). Команда - это либо простая команда, либо одна из управляющих конструкций. Кодом завершения команды является код завершения ее последней простой команды. 3.1. Цикл ДЛЯ Код:
for <переменная> [ in <набор> ]Код:
for f in *.forКод:
case $<переменная> inПример. Определить флаги и откомпилировать все указанные файлы. Код:
# инициализировать флагКод:
if <список1>3.4. Цикл ПОКА Код:
while <список1>В качестве одной из команд <списка1> может быть команда true (false). По этой команде не выполняется никаких действий, а код завершения устанавливается 0 (-1). Эти команды применяются для организации бесконечных циклов. Выход из такого цикла можно осуществить лишь по команде break (см. Специальные команды). 3.5. Функции <имя> () { <список>; } Определяется функция с именем <имя>. Тело функции - <список>, заключенный между { и }. 3.6. Зарезервированные слова Следующие слова являются зарезервированными: Код:
if then else elif fiКак правило, для выполнения каждой команды shell порождает отдельный процесс. Специальные команды отличаются тем, что они встроены в shell и выполняются в рамках текущего процесса. [CODE]: Пустая команда. Возвращает нулевой код завершения. . file Shell читает и выполняет команды из файла file, затем завершается; при поиске file используется список поиска $PATH. break [n] Выход из внутреннего for или while цикла; если указано n, то выход из n внутренних циклов. continue [n] Перейти к следующей итерации внутреннего for или while цикла; если указано n, то переход к следующей итерации n-ого цикла. cd [ <аргумент> ] Сменить текущую директорию на директорию <аргумент>. По умолчанию используется значение HOME. echo [ <арг> ... ] Выводит свои аргументы в стандартный вывод, разделяя их пробелами. eval [ <арг> ... ] Аргументы читаются, как если бы они поступали из стандартного ввода и рассматриваются как команды, которые тут же и выполняются. exec [ <арг> ... ] Аргументы рассматриваются как команды shell'а и тут же выполняются, но при этом не создается нового процесса. В качестве аргументов могут быть указаны направления ввода-вывода и, если нет никаких других аргументов, то будет изменено лишь направление ввода-вывода текущей программы. exit [ n ] Завершение выполнения shell'а с кодом завершения n. Если n опущено, то кодом завершения будет код завершения последней выполненной команды (конец файла также приводит к завершению выполнения). export [ <переменная> ... ] Данные переменные отмечаются для автоматического экспорта в окружение (см. Окружение) выполняемых команд. Если аргументы не указаны, то выводится список всех экспортируемых переменных. Имена функций не могут экспортироваться. hash [ -r ] [ <команда> ... ] Для каждой из указанных команд определяется и запоминается путь поиска. Опция -r удаляет все запомненные данные. Если не указан ни один аргумент, то выводится информация о запомненных командах: hits - количество обращений shell'а к данной команде; cost - объем работы для обнаружения команды в списке поиска; command - полное имя команды. В некоторых ситуациях происходит перевычисление запомненных данных, что отмечается значком * в поле hits. pwd Выводит имя текущей директории. read [ <переменная> ... ] Читается из стандартного ввода одна строка; первое ее слово присваивается первой переменной, второе - второй и т.д., причем все оставшиеся слова присваиваются последней переменной. readonly [ <переменная> ... ] Запрещается изменение значений указанных переменных. Если аргумент не указан , то выводится информация обо всех переменных типа readonly. return [ n ] Выход из функции с кодом завершения n. Если n опущено, то кодом завершения будет код завершения последней выполненной команды. set [ --aefkntuvx [ <арг> ... ] ] Команда устанавливает следующие режимы: -a отметить переменные, которые были изменены или созданы, как переменные окружения (см. Окружение) -e если код завершения команды ненулевой, то немедленно завершить выполнение shell'а -f запретить генерацию имен файлов -k все переменные с именем помещаются в окружение команды, а не только те, что предшествуют имени команды (см. Окружение) -n читать команды, но не выполнять их -t завершение shell'а после ввода и выполнения одной команды -u при подстановке рассматривать неустановленные переменные как ошибки -v вывести вводимые строки сразу после их ввода -x вывести команды и их аргументы перед их выполнением -- не изменяет флаги, полезен для присваивания позиционным переменным новых значений. При указании + вместо - каждый из флагов устанавливает противоположный режим. Набор текущих флагов есть значение переменной $-. <арг> - это значения, которые будут присвоены позиционным переменным $1, $2 и т.д. Если все аргументы опущены, выводятся значения всех переменных. shift [ n ] Позиционные переменные, начиная с $(n+1), переименовываются в $1 и т.д. По умолчанию n=1. test вычисляет условные выражения (см. Дополнительные сведения. Test ) trap [ <арг> ] [ n ] ... Команда <арг> будет выполнена, когда shell получит сигнал n (см. Сигналы). (Надо заметить, что <арг> проверяется при установке прерывания и при получении сигнала). Команды выполняются по порядку номеров сигналов. Любая попытка установить сигнал, игнорируемый данным процессом, не обрабатывается. Попытка прерывания по сигналу 11 (segmentation violation) приводит к ошибке. Если <арг> опущен, то все прерывания устанавливаются в их начальные значения. Если <арг> есть пустая строка, то этот сигнал игнорируется shell'ом и вызываемыми им программами. Если n=0, то <арг> выполняется при выходе из shell'а. Trap без аргументов выводит список команд, связанных с каждым сигналом. ... [/SIZE] При написании статьи были использованы материалы с сайтов: http://www.citforum.ru , http://www.linuxcenter.ru/ |
У меня книжка Администратирование Linux даже разделы совпадают...
|
...продолжение..
type [ <имя> ... ] Для каждого имени показывает, как оно будет интерпретироваться при использовании в качестве имени команды: как внутренняя команда shell'а, как имя файла или же такого файла нет вообще.
ulimit [ -f ] [ n ] Устанавливает размер файла в n блоков; -f - устанавливает размер файла, который может быть записан процессом-потомком (читать можно любые файлы). Без аргументов - выводит текущий размер. umask [ nnn ] Пользовательская маска создания файлов изменяется на nnn. Если nnn опущено, то выводится текущее значение маски. Пример: после команды umask 755 будут создаваться файлы, которые владелец сможет читать, писать и выполнять, а все остальные - только читать и выполнять. unset [ <имя> ... ] Для каждого имени удаляет соответствующую переменную или функцию. Переменные PATH, PS1, PS2 и IFS не могут быть удалены. wait [ n ] Ждет завершения указанного процесса и выводит код его завершения. Если n не указано, то ожидается завершения всех активных процессов-потомков и возвращается код завершения 0. 4. Выполнение shell-программ 4.1. Запуск shell'а Программа, интерпретирующая shell-программы, находится в файле /bin/sh. При запуске ее первый аргумент является именем shell-программы, остальные передаются как позициональные параметры. Если файл, содержащий shell-программу, имеет право выполнения (x), то достаточно указания лишь его имени. Например, следующие две команды операционной системы эквивалентны (если файл ficofl обладает указанным правом и на самом деле содержит shell-программу): Код:
sh ficofl -d . g\*При выполнении shell-программ выполняются все подстановки. Если имя команды совпадает с именем специальной команды, то она выполнается в рамках текущего процесса. Так же выполняются и определенные пользователем функции. Если имя команды не совпадает ни с именем специальной команды, ни с именем функции, то порождается новый процесс и осуществляется попытка выполнить указанную команду. Переменная PATH определяет путь поиска директории, содержащей данную команду. По умолчанию это Код:
::/bin:/usr/ bin:/util:/dss/rk4.3. Окружение Окружение - это набор пар имя-значение, которые передаются выполняемой программе. Shell взаимодействует с окружением несколькими способами. При запуске shell создает переменную для каждой указанной пары, придавая ей соответствующее значение. Если вы измените значение какой-либо из этих переменных или создадите новую переменную, то это не окажет никакого влияния на окружение, если не будет использована команда export для связи переменной shell'а с окружением (см. также set -a). Переменная может быть удалена из окружения командой unset (см.). Таким образом, окружение каждой из выполняемых shell'ом команд формируется из всех неизмененных пар имя-значение, первоначально полученных shell'ом, минус пары, удаленные командой unset, плюс все модифицированные и измененные пары, которые для этого должны быть указаны в команде export. Окружение простых команд может быть сформировано указанием перед ней одного или нескольких присваиваний переменным. Так, Код:
TERM=d460 <команда>Код:
(export TERM; TERM=d460; <команда>)Если установлен флаг -k (см. set), то все ключевые параметры помещаются в окружение команды, даже если они записаны после команды. 4.4. Сигналы UNIX'ом поддерживаются следующие сигналы: Код:
SIGHUP - 1 - отменить (hangup) 4.5. Замечания При выполнении команд запоминается их местонахождение. Поэтому при создании команды с тем же именем, но находящейся в другой директории, все равно будет выполняться старая команда (если вызов происходит по короткому имени). Для исправления ситуации воспользуйтесь командой hash с ключом -r (см. Специальные команды). Если вы переименовали текущую или вышележащую директорию, то команда pwd может давать неверную информацию. Для исправления ситуации воспользуйтесь командой cd с полным именем директории. 5. Дополнительные сведения 5.1. Команда test Команда test применяется для проверки условия. Формат вызова: Код:
test <выражение>Код:
-r файл - истина, если файл существует и доступен для чтения Команда expr применяется для вычисления выражений. Результат выводится на стандартный вывод. Операнды выражения должны быть разделены пробелами. Метасимволы должны быть экранированы. Надо заметить, что 0 возвращается в качестве числа, а не для индикации пустой строки. Строки, содержащие пробелы или другие специальные символы, должны быть заключены в кавычки. Целые рассматриваются как 32-битные числа. Ниже приведен список операторов в порядке возрастания приоритета, операции с равным приоритетом заключены в фигурные скобки. Перед символами, которые должны быть экранированы, стоит \. Код:
<выр> \| <выр> если первое <выр> не пустое и не нулевое, то возвращает его, иначе возвращает второе <выр> Код:
. - обозначает любой символ Примеры. Код:
1.Код:
expr $a : '.*/\(.*\)' \| $a3. Код:
expr $VAR : '.*'В качестве побочного эффекта expr возвращает следующие коды завершения: 0 - если выражение не нуль и не пустая строка 1 - если выражение нуль или пустая строка 2 - для некорректных выражений Команда expr также выдает следующие сообщения об ошибках: Код:
syntax error - для ошибок в операторах или операндах Код:
expr $a = '='Код:
expr = = =Код:
expr X$a = X=5.3. Команда ena Команда ena позволяет получить части полного имени файла. Первый аргумент - флаг, второй - имя файла. Команда различает следующие флаги: Код:
-n - имя файла без расширения Код:
# Get part of pathnameНа этом я заканчиваю длинное повествование о столь мощном языке мобильного программирования. Как дополнительный материал хочу выделить электронныу книгу о программирование в стандарте POSIX (http://www.intuit.ru/department/se/pposix/2/) {================================================= ===========} По поводу замечаний сказаных ниже:: Весь материал был взят с указанных сайтов, скомпанован, немного отредактирован и представлен в позновательных целях. Соответственно я не претендую на полное авторство данной статьи.. з.ы.В дальнейшем статья будет редактироваться и дополняться новым и авторским (то бишь от меня) материалом. При написании статьи были использованы материалы с сайтов: http://www.citforum.ru , http://www.linuxcenter.ru/ |
Цитата:
|
Что-то мне не верится что это аффтар написал..
Переместите в "чужие статьи" |
Цитата:
|
А вот такой вопрос:
есть файл вида: Interesting ports on 1.1.72.66: 21/tcp filtered ftp Interesting ports on 1.1.72.67: 21/tcp open ftp Interesting ports on 1.1.72.68: 21/tcp filtered ftp Interesting ports on 1.1.72.69: 21/tcp filtered ftp Interesting ports on 1.1.72.70: 21/tcp open ftp Interesting ports on 1.1.72.71: 21/tcp filtered ftp ... не силен в регулярных выражениях(( как на bash отделить в отдельный файл вида ip:port open??? |
Да вот ИМХО один в один написано, даже нумерация пунктов совпадает... походу копипаст в чистом виде, никакой компоновки не заметил...
p.s. Этот текст подготовлен НПО "КЛОТО" Last-modified: Sun, 07 Jul 2002 09:31:58 GMT |
Цитата:
|
Цитата:
Код:
#!/usr/bin/perl |
| Время: 03:52 |