Учебная работа. Реферат: Интерпретатор командного языка shell

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Контрольные рефераты

Учебная работа. Реферат: Интерпретатор командного языка shell

1. Главные понятия языка shell

1.1. Ввод-вывод

Три направления ввода-вывода являются выделенными — обычный ввод, обычный вывод и обычный протокол. Обычно, команды берут начальные данные из обычного ввода и помещают результаты в обычный вывод.

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

< <название файла>

служит для переназначения обычного ввода (дескриптор файла 0),

> <имя файла>

для обычного вывода (дескриптор файла 1);

<< <строчка>

ввод происходит со обычного ввода, пока не повстречается обозначенная <строчка> либо конец файла,

>> <имя файла>

для обычного вывода; если файл существует, то выводимая информация добавляется к конец этого файла,

<& <цифра>

в качестве обычного ввода о(r)является файл, ассоциированный с дескриптором <цифра>; аналогично для обычного вывода

>& <цифра>

<&- и >&-

закрывают соответственно обычный ввод и вывод.

Если хоть какой из этих конструкций предшествует цифра, то с обозначенным файлом будет ассоциирован дескриптор, равный обозначенной цифре, заместо 0 и 1 по дефлоту. к примеру,

2 > <название файла>

для обычного протокола употребляется дескриптор 2, а

2 >& 1

сравнивает дескриптор 2 с файлом, ассоциированным с дескриптором 1.

… 2>protocol

переназначает обычный протокол (дескриптор 2) в файл по имени protocol.

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

… 2>&1

Важен порядок переназначения: shell производит переназначение слева вправо по обозначенному списку. Так,

1 > xxx 2 >& 1

поначалу сравнивает дескриптор 1 с файлом xxx, а потом дескриптор 2 с 1, т.е. тоже с xxx. А

2 >& 1 1 > xxx

сравнивает дескриптор 2 с терминалом, а 1 — с файлом xxx.

Можно переназначить системный ввод на текущий файл:

isql — — <

1.2. Синхронное и асинхронное выполнение установок

Обычно shell ожидает окончания выполнения команды. Но имеется возможность запустить задачку в асинхронном режиме, т.е. без ожидания ее окончания. Для этого опосля команды (опосля всех ее аргументов и указаний о переназначении ввода-вывода) нужно поставить символ &. При всем этом по дефлоту обычный ввод команды назначается на пустой файл /dev/null.

Пример: сделать файл primer можно по команде

echo > primer

Еще пример: запустить программку prog в асинхронном режиме, чтоб не было надо дожидаться его окончания, засечь время выполнения, результаты программки навести в файл prog.res, данные о времени выполнения — в файл prog.tim.

time prog > prog.res 2> prog.tim &

1.3. Сборочный поток

Сборочный поток — последовательность установок, разбитых знаком |. Если опосля сборочного потока стоит ; shell ожидает его окончания. Если & — то не ожидает. Роль ; может играться конец строчки. Смысл сборочного потока в том, что обычный вывод одной команды замыкается на обычный ввод иной. Пример сборочного потока — подсчитать число о(r)ектных файлов в текущем каталоге.

ls *.o | wc -l

1.4. Метасимволы, генерация названий файлов

Метасимволы — знаки, имеющие особое

? * ; & ( ) | ^ < > <пробел> <табуляция> <возврат_каретки>

Но любой из этих знаков может представлять самого себя, если перед ним стоит . Все знаки, заключенные меж кавычками ‘ и ‘, представляют самих себя. Меж двойными кавычками («) производятся подстановки установок (см п. 2.2) и характеристик (см. п. 2.3), а знаки , `,» и $ могут экранироваться предыдущим эмблемой .

Опосля всех подстановок в любом слове команды ищутся знаки *,?, и [. Если находится хотя бы один из их, то это слово рассматривается как шаблон названий файлов и заменяется названиями файлов, удовлетворяющих данному шаблону (в алфавитном порядке). Если ни одно имя файла не удовлетворяет шаблону, то он остается постоянным. значения обозначенных знаков:


*
неважно какая строчка, включая и пустую

?
один хоть какой знак

[…]
хоть какой из обозначенных меж ними знаков. Пара знаков, разбитых знаком -, значит хоть какой знак, который находится меж ними, включая и их самих. Если первым эмблемой опосля «[» идет «!», то обозначенные знаки не должны заходить в имя файла

2. Синтаксис языка shell

2.1. Комменты

Строчки, начинающиеся с #, трактуются как комменты.

2.2. Подстановка результатов выполнения установок

Выражения можно заключать в оборотные кавычки (`). Такие выражения рассчитываются в месте использования. Они могут быть, к примеру, частью строк. Пример. Пусть параметром макрокоманды является имя файла с расширением .for. Требуется удалить одноименный файл с расширением .err.

name=`ena -n $1`

rm -f ${name}.err

Значение, приобретенное в итоге выполнения команды

ena -n $1

присваивается переменной name. Фигурные скобки применены для выделения аргумента операции перехода от имени к значению. Без их .err наклеилась бы к имени.

2.3. Переменные и подстановка их значений

Все переменные в языке shell — текстовые. Их имена должны начинаться с буковкы и состоять из латинских букв, цифр и знака подчеркивания (_). Чтоб пользоваться значением переменной, нужно перед ней поставить знак $. Внедрение значения переменной именуется подстановкой.

Различается два класса переменных: позиционные и с именованием. Позиционные переменные — это аргументы командных файлов, их именами служат числа: $0 — имя команды, $1 — 1-ый аргумент и т.д. Значения позиционным переменным могут быть присвоены и командой set (см. Особые команды). Пример. Опосля вызова программки на shellе, лежащей в файле ficofl:

ficofl -d / *.for

значением $0 будет ficofl, $1 — -d, $2 — /, $3 — *.for, значения других позиционных переменных будут пустыми строчками. Заметим, что если б знак * при вызове ficofl не был экранирован, в качестве аргументов передались бы имена всех фортранных файлов текущей директории.

Еще две переменные хранят командную строчку кроме имени команды: $@ эквивалентно $1 $2 …, а $* — «$1 $2 …». Исходные значения переменным с именованием могут быть установлены последующим образом:

<имя>=<значение> [ <имя>=<значение> ] …

Не быть может сразу функции (см. Управляющие конструкции) и переменной с схожими именами. Для подстановки значений переменных вероятны также последующие конструкции:

${<переменная>}

если имени.

${<переменная>:-<слово>}

если <переменная> определена и не является пустой строчкой, то подставляется ее

${<переменная>:=<слово>}

если <переменная> не определена либо является пустой строчкой, ей присваивается

${<переменная>:?<слово>}

если <переменная> определена и не является пустой строчкой, то подставляется ее слово> и выполнение shellа заканчивается. Если <слово> опущено, то выдается сообщение «parameter null or not set».

${<переменная>:+<слово>}

если <переменная> определена и не является пустой строчкой, то подставляется <слово>; по другому подставляется пустая строчка.

Пример: если переменная d не определена либо является пустой строчкой, то производится команда pwd

echo ${d:-`pwd`}

Последующие переменные автоматом инсталлируются shell’ом:


#
количество позиционных характеристик (десятичное)


флаги, обозначенные при запуске shellа либо командой set

?
десятичное Напомним: чтоб получить значения этих переменных, перед ними необходимо поставить символ $. Пример: выдать номер текущего процесса:

echo $$

2.4. Особые переменные

Shell’ом употребляются последующие особые переменные:


HOME
директория, в которую юзер попадает при входе в систему либо при выполнении команды cd без аргументов

Path
перечень полных имен каталогов, в каких ищется файл при указании его неполного имени.

PS1
основная строчка приглашения (по дефлоту $)

PS2
доборная строчка приглашения (по дефлоту >); в интерактивном режиме перед вводом команды shell’ом выводится основная строчка приглашения.
Если нажата кнопка new_line, но для окончания команды требуется предстоящий ввод, то выводится доборная строчка приглашения

IFS
последовательность знаков, являющихся разделителями в командной строке (по дефлоту это <пробел>, <табуляция> и <возврат_каретки>)

3. Управляющие конструкции

Обычная команда — это последовательность слов, разбитая пробелами. 1-ое слово является именованием команды, которая будет производиться, а другие будут переданы ей как аргументы. имя команды передается ей как аргумент номер 0 (т.е. имя команды является значением $0). Значение, возвращаемое обычной командой — это ее статус окончания, если она закончилась нормально, либо (восьмеричное) 200+статус, если она закончилась аварийно.

Перечень — это последовательность 1-го либо нескольких конвейеров, разбитых знаками ;, &, && либо || и может быть заканчивающаяся эмблемой ; либо &. Из 4 обозначенных операций ; и & имеют равные ценности, наименьшие, чем у && и ||. Ценности крайних также равны меж собой. знак ; значит, что сборочные потоки будут производиться поочередно, а & — параллельно. Операция && (||) значит, что перечень, последующий за ней будет производиться только в том случае, если код окончания предшествующего сборочного потока нулевой (ненулевой).

Команда — это или обычная команда, или одна из управляющих конструкций. Кодом окончания команды является код окончания ее крайней обычной команды.

3.1. Цикл ДЛЯ

for <переменная> [ in <набор> ]

do

<перечень>

done

Если часть in <набор> опущена, то это значит in «$@» ( другими словами in $1 $2 … $n). Пример. Вывести на экран все фортранные файлы текущей библиотеки:

for f in *.for

do

cat $f

done

3.2. Оператор выбора

case $<переменная> in

<шаблон> | <шаблон>… ) <перечень> ;;

. . .

esac

Оператор выбора делает <перечень>, соответственный первому <шаблону>, которому удовлетворяет <переменная>. Форма шаблона та же, что и применяемая для генерации названий файлов. часть | шаблон… может отсутствовать.

Пример. Найти флаги и откомпилировать все обозначенные файлы.

# инициализировать флаг

flag=

# повторять для всякого аргумента

for a

do

case $a in

# о(r)единить флаги, разделив их пробелами

-[ocSO]) flag=$flag’ ‘ $a ;;

-*) echo ‘unknown flag $a’ ;;

# составлять любой начальный файл и сбросить флаги

*.c) cc $flag $a; flag= ;;

*.s) as $flag $a; flag= ;;

*.f) f77 $flag $a; flag= ;;

# неправильный аргумент

*) echo ‘unexpected argument $a’ ;;

esac

done

3.3. Условный оператор.

if <список1>

then

<список2>

[ elif <список3>

then

<список4> ]

. . .

[ else

<список5> ]

fi

Производится <список1> и, если код его окончания 0, то производится <список2>, по другому — <список3> и, если и его код окончания 0, то производится <список4>. Если же это не так, то производится <список5>. части elif и else могут отсутствовать.

3.4. Цикл ПОКА

while <список1>

do

<список2>

done

До того времени, пока код окончания крайней команды <списка1> есть 0, производятся команды <списка2>. При подмене служебного слова while на until условие выхода из цикла изменяется на обратное.

В качестве одной из установок <списка1> быть может команда true (false). По данной команде не производится никаких действий, а код окончания устанавливается 0 (-1). Эти команды используются для организации нескончаемых циклов. Выход из такового цикла можно выполнить только по команде break (см. Особые команды).

3.5. Функции

<имя> () {

<перечень>;

}

Определяется функция с именованием <имя>. Тело функции — <перечень>, заключенный меж { и }.

3.6. Зарезервированные слова

Последующие слова являются зарезервированными:

if then else elif fi

case in esac { }

for while until do done

3.7. Особые команды

Как правило, для выполнения каждой команды shell порождает отдельный процесс. Особые команды различаются тем, что они интегрированы в shell и производятся в рамках текущего процесса.


:
Пустая команда. Возвращает нулевой код окончания.

. 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 [ <переменная> … ]
Читается из обычного ввода одна строчка; 1-ое ее слово присваивается первой переменной, 2-ое — 2-ой и т.д., при этом все оставшиеся слова присваиваются крайней переменной.

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 без аргументов выводит перечень установок, связанных с каждым сигналом.

type [ <имя> … ]
Для всякого имени указывает, как оно будет интерпретироваться при использовании в качестве имени команды: как внутренняя команда shell’а, как имя файла либо же такового файла нет совершенно.

ulimit [ -f ] [ n ]
Устанавливает размер файла в n блоков; -f — устанавливает размер файла, который быть может записан процессом-потомком (читать можно любые файлы). Без аргументов — выводит текущий размер.

umask [ nnn ]
Пользовательская маска сотворения файлов меняется на nnn. Если nnn опущено, то выводится текущее обладатель сумеет читать, писать и делать, а все другие — лишь читать и делать.

unset [ <имя> … ]
Для всякого имени удаляет подобающую переменную либо функцию. Переменные Path, PS1, PS2 и IFS не могут быть удалены.

wait [ n ]
Ожидает окончания обозначенного процесса и выводит код его окончания. Если n не обозначено, то ожидается окончания всех активных процессов-потомков и ворачивается код окончания 0.

4. Выполнение shell-программ

4.1. Пуск shell’а

программка, интерпретирующая shell-программы, находится в файле /bin/sh. При запуске ее 1-ый аргумент является именованием shell-программы, другие передаются как позициональные характеристики. Если файл, содержащий shell-программу, имеет Право выполнения (x), то довольно указания только его имени. К примеру, последующие две команды операционной системы эквивалентны (если файл ficofl владеет обозначенным правом и по сути содержит shell-программу):

sh ficofl -d . g*

и

ficofl -d . g*

4.2. Выполнение

При выполнении shell-программ производятся все подстановки. Если имя команды совпадает с именованием специальной команды, то она выполнается в рамках текущего процесса. Так же производятся и определенные юзером функции. Если имя команды не совпадает ни с именованием специальной команды, ни с именованием функции, то порождается новейший процесс и осуществляется попытка выполнить обозначенную команду.

Переменная Path описывает путь поиска директории, содержащей данную команду. По дефлоту это

::/bin:/usr/ bin:/util:/dss/rk

Директории поиска делятся двоеточиями; :: значит текущую директорию. Если имя команды содержит знак /, значение $Path не употребляется: имена, начинающиеся с / ищутся от корня, другие — от текущей директории. Положение отысканной команды запоминается shellом и быть может опрошено командой hash.

4.3. Свита

Свита — это набор пар имя-значение, которые передаются выполняемой программке. Shell ведет взаимодействие с окружением несколькими методами. При запуске shell делает переменную для каждой обозначенной пары, придавая ей соответственное имя-значение, сначало приобретенных shell’ом, минус пары, удаленные командой unset, плюс все измененные и модифицированные пары, которые для этого должны быть указаны в команде export.

Свита обычных установок быть может сформировано указанием перед ней 1-го либо нескольких присваиваний переменным. Так,

TERM=d460 <команда>

и

(export TERM; TERM=d460; <команда>)

эквивалентны. Переменные, участвующие в таковых присваиваниях, назовем главными параметрами.

Если установлен флаг -k (см. set), то все главные характеристики помещаются в свита команды, даже если они записаны опосля команды.

4.4. Сигналы

unix‘ом поддерживаются последующие сигналы:


SIGHUP
— 1 —
отменить (hangup)

SIGINT
— 2 —
прерывание (interrupt)

SIGQUIT
— 3 —
необычный выход (quit)

SIGILL
— 4 —
неправильная команда (illegal instruction)

SIGTRAP
— 5 —
ловушка (trace trap)

SIGFPE
— 8 —
исключительная ситуация при выполнении операций с плавающей запятой (floating-канал без чтения из него (write on a pipe with no one to read it)

SIGALRM
— 14 —
будильник (alarm clock)

SIGTERM
— 15 —
программное окончание процесса (software termination signal)

Сигналы SIGINT и SIGQUIT игнорируются, если команда была запущена асинхронно. По другому сигналы обрабатываются так же, как в процессе-предке, кроме сигнала SIGSEGV (см. также Особые команды. Trap).

4.5. Замечания

При выполнении установок запоминается их местопребывание. Потому при разработке команды с этим же именованием, но находящейся в иной директории, все равно будет производиться древняя команда (если вызов происходит по недлинному имени). Для исправления ситуации воспользуйтесь командой hash с ключом -r (см. Особые команды).

Если вы переименовали текущую либо вышележащую директорию, то команда pwd может давать неправильную информацию. Для исправления ситуации воспользуйтесь командой cd с полным именованием директории.

5. Доп сведения

5.1. Команда test

Команда test применяется для проверки условия. формат вызова:

test <выражение>

либо

[ <выражение> ]

Команда test вычисляет <выражение> и, если его
-r файл
— правда, если файл существует и доступен для чтения

-w файл
— правда, если файл существует и доступен для записи

-x файл
— правда, если файл существует и является выполняемым

-f файл
— правда, если файл существует и является обыденным файлом

-d файл
— правда, если файл существует и является директорией

-c файл
— правда, если файл существует и является особым символьно-ориентированным файлом

-b файл
— правда, если файл существует и является особым блок-ориентированным файлом

-p файл
— правда, если файл существует и является именованным каналом (pipe)

-s файл
— правда, если файл существует и имеет ненулевую длину

-t [ дескриптор файла ]
правда, если открытый файл с обозначенным дескриптором (по дефлоту 1) существует и ассоциирован с терминалом

-z s1
Правда, если длина строчки s1 нулевая

-n s1
Правда, если длина строчки s1 ненулевая

s1 = s2
Правда, если строчки s1 и s2 совпадают

s1 != s2
Правда, если строчки s1 и s2 не совпадают

s1
Правда, если s1 непустая строчка

n1 -eq n2
правда, если целые n1 и n2 алгебраически совпадают . На месте -eq могут быть также -ne, -gt, -ge, -lt, -le

5.2. Команда expr

Команда expr применяется для вычисления выражений. Итог выводится на обычный вывод. Операнды выражения должны быть разбиты пробелами. Метасимволы должны быть экранированы. нужно увидеть, что 0 ворачивается в качестве числа, а не для индикации пустой строчки. Строчки, содержащие пробелы либо остальные особые знаки, должны быть заключены в кавычки. Целые рассматриваются как 32-битные числа.

Ниже приведен перечень операторов в порядке возрастания приоритета, операции с равным ценностью заключены в фигурные скобки. Перед знаками, которые должны быть экранированы, стоит .


<выр> | <выр>
если 1-ое <выр> не пустое и не нулевое, то возвращает его, по другому возвращает 2-ое <выр>

<выр> & <выр>
если оба <выр> не пустые и не нулевые, то возвращает 1-ое <выр>, по другому возвращает 0

<выр> { =, >, >=, <, <=, != } <выр>
возвращает итог целочисленного сопоставления если оба <выр> — целые; по другому возвращает итог лексического сопоставления

<выр> { +, — } <выр>
сложение и вычитание целочисленных аргументов

<выр> { *, /, % } <выр>
умножение, деление и получение остатка от деления целочисленных аргументов

<выр> : <выр>
оператор сравнения : сопоставляет 1-ый аргумент со вторым, который должен быть постоянным выражением. Обычно оператор сопоставления возвращает число знаков, удовлетворяющих эталону (0 при неудачном сопоставлении). Но знаки ( и ) могут применяться для выделения части первого аргумента.

Постоянное выражение строится последующим образом:


.
— обозначает хоть какой знак

*
— обозначает предшествующий знак, повторенный несколько раз

[]
— обозначают хоть какой один из обозначенных меж ними знаков; группа знаков может обозначаться при помощи знака «-» (т.е. [0-9] эквивалентно [0123456789]); если опосля [ стоит ^, то это эквивалентно любому символу, кроме указанных в скобках и <возврата_каретки>; для указания ] в качестве эталона, нужно поставить ее сходу за [ (т.е. []…]); . и * снутри квадратных скобок обозначают самих себя

Все другие знаки (и ^, если стоит не в квадратных скобках) обозначают самих себя. Для указания знаков ., *,[ и ] нужно экранировать их (т.е. писать ., *, [, ]).

Примеры.

1.

a=`expr $a + 1`

— повышение на 1 переменной a

2.

expr $a : ‘.*/(.*)’ | $a

— выделяет из имени файла куцее имя (т.е. из /usr/util/ena выделяется ena). внимание, одиночный знак / будет воспринят как символ операции деления.

3.

expr $VAR : ‘.*’

— получение количества знаков переменной VAR.

В качестве побочного эффекта expr возвращает последующие коды окончания:


0
— если выражение не нуль и не пустая строчка

1
— если выражение нуль либо пустая строчка

2
— для неправильных выражений

Команда expr также выдает последующие сообщения о ошибках:


syntax error
— для ошибок в операторах либо операндах

non-numeric argument
— для попыток внедрения арифметических операций к нечисловым строчкам

Замечание.

Допустим, что мы желаем сопоставить к примеру, со знаком равенства. Пусть $a по сути является знаком равенства. Потому что аргументы за ранее обрабатываются shell’ом, то команда

expr $a = ‘=’

будет воспринята как

expr = = =

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

expr X$a = X=

т.е. добавлением некого знака к обеим строчкам, что никак не влияет на итог сопоставления, но дозволяет избежать синтаксической ошибки.

5.3. Команда ena

Команда ena дозволяет получить части полного названии файла. 1-ый аргумент — флаг, 2-ой — имя файла. Команда различает последующие флаги:


-n
имя файла без расширения

-f
имя файла с расширением

-e
расширение

-d
имя директории

-p
— если название файла начинается с . либо .. , то эти знаки выделяются из имени

Ниже приводится текст программки ena, лежащий в /util/ena.

# Get part of pathname

case $1 in

-n )

expr $2 : ‘.*/(.*)[.].*’ | $2 : ‘(.*)[.].*’ | $2

;;

-f )

expr $2 : ‘.*/(.*)’ | $2

;;

-e )

expr $2 : ‘.*([.][^./]*)’ | ‘ ‘

;;

-d )

expr $2 : ‘(.*)/.*’ | $2

;;

-p )

expr $2 : ‘([.])/.*’ | $2 : ‘([.][.])/.*’ | ‘ ‘

;;

* )

echo «error: unknown part of pathname $1»

exit 2

;;

esac

]]>