Переменная окружения

С одной стороны, переменная окружения - обыкновенная строковая переменная, в которой кто угодно может хранить какие угодно значения; ее даже и описывать не надо:

$ One=U; Three=Zzz$ echo Example 1: $One $Two $ThreeExample 1: U Zzz$ echo "Example 2: $One $Two $Three"Example 2: U Zzz$ echo 'Example 3: $One $Two $Three'Example 3: $One $Two $Three

Из первого примера видно, что сам факт присваивания объявляет переменную, а содержимое необъявленной переменной просто считается пустым (напомним, что команда echo выводит все параметры командной строки, разделяя их пробелом). Как показывают второй и третий примеры, подстановка значения переменной (операция $имя_переменной) продолжает работать, если текст заключен в двойные кавычки, и не работает, если используются одинарные. По договоренности (см. главу 7) закавыченный текст передается как один параметр командной строки. Теперь очевидно, что подстановку shell делает до вызова команды; только этим можно объяснить, почему в первом примере echo выводит один пробел между U и Zzz: она получает четыре параметра (Example 1: U и Zzz), разделенные цепочками пробелов.

Несмотря на то что переменные в shell - строкового типа, легко организовать арифметические операции над ними: если содержимое переменной нельзя интерпретировать как число, арифметическая операция завершается с ошибкой. Арифметика встроена почти во все виды командных интерпретаторов (см. "Сравнительную таблицу командных интерпретаторов"), однако, к сожалению, в каждом это сделано слегка по-своему. Наиболее распространена арифметическая подстановка (arithmetic expansion), при которой shell вычисляет строки вида $((арифметическое выражение)). Есть надежда, что арифметическая подстановка с целыми числами в версии современного BSD- sh или Linux- ash будет работать и в остальных командных интерпретаторах гнезда Bourne:

$ A=7; b=3; echo $(($A*$b))21

В примере, описывающем понятие сценария, мы видели, как в shell устроен механизм передачи параметров командной строки. Все просто: первый параметр попадает внутри сценария в переменную с именем 1 (подстановка значения этой переменной выглядит как $1), второй - в переменную с именем 2 и т. д., пока есть параметры в командной строке. Имя самого сценария передается в переменной 0 в точности так, как мы его вызвали. Количество переданных параметров подставится вместо $# (напомним, что по американской традиции этот символ используется вместо нашего No). Все параметры командной строки подставляются вместо $*или $@ (Какая между этими формами разница? RTFM!)

Столь простая схема передачи параметров - явная доработка языка в сторону средств интеграции: чаще всего небольшой сценарий - это некоторая составная пользовательская команда, связывающая несколько утилит, и чтобы она не была одноразовой, ей наверняка придется уметь обрабатывать командную строку.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: