Учебная работа. Реферат: Интерпретатор командного языка 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
]]>