Основы программирования в Linux
classic> <b>echo $version</b>classicclassic> <b>. /latest_set</b>latest version> <b>echo $version</b>latestlatest version>Как это работает
Сценарии выполняются, используя команду "точка", поэтому каждый из них выполняется в текущей командной оболочке. Это позволяет сценарию изменять параметры окружения в текущей оболочке, которая сохраняет изменения даже после того, как сценарий завершился.
echoНесмотря на призыв группы Х/Open применять в современных командных оболочках команду
, мы будем продолжать следовать общепринятой практике использования командыprintfдля вывода строки с последующим переходом на новую строку.echoПри этом возникает общая проблема: удаление символа перехода на новую строку. К сожалению, в разных версиях ОС UNIX реализованы разные решения. В ОС Linux общепринятый метод
echo -n "string to output"Но вы часто будете сталкиваться и с вариантом
echo -е "string to output\c"Второй вариант
рассчитан на то, что задействована интерпретация символов escape-последовательности, начинающихся с обратного слэша, таких какecho -едля подавления новой строки,\cдля вывода табуляции,\tдля вывода символов возврата каретки. В более старых версиях bash этот режим установлен по умолчанию, а в более современных версиях интерпретация символов escape-последовательностей с обратным слэшем отключена. Подробные сведения о поведении вашего дистрибутива ищите на страницах интерактивного справочного руководства.\nПримечаниеЕсли вам нужен легко переносимый способ удаления завершающей новой строки, для избавления от нее можно воспользоваться внешней командой
, но она будет выполняться немного медленнее. Если вашим системам UNIX нужна переносимость и нужно избавиться от завершающей новой строки, как правило, лучше придерживаться командыtr. Если ваши сценарии предназначены для работы только в ОС Linux и bash, вполне подойдетprintf, хотя, возможно, придется начинать файл со строкиecho -nдля того, чтобы в явной форме показать, что вы рассчитываете на поведение в стиле bash.#!/bin/bashevalКоманда eval позволяет вычислять аргументы. Она встроена в командную оболочку и обычно не представлена как отдельная команда. Лучше всего ее действие демонстрирует короткий пример, позаимствованный непосредственно из стандарта X/Open.
foo=10x=fooу='$'$хecho $уБудет выведено
. Однако код$foofoo=10x=fooeval у='$'$хecho $увыведет на экран 10. Таким образом,
немного похожа на дополнительный знакeval: она возвращает значение значения переменной.$Команда
очень полезна, т.к. позволяет генерировать и выполнять код на лету. Применение этой команды усложняет отладку сценария, но разрешает делать то, что в противном случае выполнить сложно или даже невозможно.evalexecУ команды
два варианта применения. Обычно ее используют для замены текущей командной оболочки другой программой.execНапример, строка
exec wall "Thanks for all the fish"в сценарии заменит текущую оболочку командой
. Строки, следующие за командойwall, не обрабатываются, потому что командная оболочка, выполнявшая сценарий, больше не существует.execВторой вариант применения
— модификация текущих дескрипторов файлов.execexec 3< afileЭта команда открывает файловый дескриптор 3 для чтения из файла afile. Этот вариант редко используется.
exit nКоманда
вызывает завершение сценария с кодом завершенияexit. Если вы примените ее в строке подсказки или приглашения любой интерактивной командной оболочки, она приведет к вашему выходу из системы. Если разрешить сценарию завершиться без указания кода завершения, статус последней выполненной в сценарии команды используется как возвращаемое значение. Задание кода завершения считается хорошим стилем программирования.<i>n</i>При программировании сценариев в командной оболочке код завершения 0 — успешное завершение сценария, коды от 1 до 125 включительно — коды ошибок, которые можно использовать в сценариях. Оставшиеся значения зарезервированы в соответствии с табл. 2.5.
Таблица 2.5
Код завершения Описание 126 Файл не является исполняемым 127 Команда не найдена 128 и выше Появившийся сигнал Многим программистам на языках С и С++ использование нуля как признака успешного завершения может показаться несколько необычным. Большое преимущество сценариев — возможность применения 125 кодов ошибок, определенных пользователем, и отсутствие необходимости в глобальной переменной для хранения кода ошибки.
Далее приведен простой пример, возвращающий код успешного завершения, если в текущем каталоге существует файл с именем .profile.
#!/bin/shif [ -f .profile ]; thenexit 0fiexit 1Если вы любитель острых ощущений или, как минимум, лаконичных сценариев, можете переписать сценарий в виде одной строки, используя комбинацию И-списка и ИЛИ-списка, описанных ранее:
[ -f .profile ] && exit 0 || exit 1exportКоманда
делает переменную, называемую ее параметром, доступной в подоболочках. По умолчанию переменные, созданные в командной оболочке, не доступны в новых дочерних подоболочках, запускаемых из данной. Командаexportсоздает из своего параметра переменную окружения, которая видна другим сценариям и программам, запускаемым из текущей программы. Говоря профессиональным языком, экспортируемые переменные формируют переменные окружения в любых дочерних процессах, порожденных командной оболочкой. Лучше всего проиллюстрировать это примером из двух сценариев:exportиexport1(упражнение 2.14).export2