HPUNIX Сайт о ОС и не только!

Переменные Linux

8 января 2009 - unix

#image.jpgПривет, читателям моего блога. Не так издавна вызнал практически все о переменных в интерпретаторе bash. На данный момент желаю для вас об этом рассказать.

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

Переменная в bash может представлять собой число, символ или строку символов. Имя переменной может начинаться с буквы или с знака подчеркивания и не может содержать дефис.Физически, переменные представляют собой именованные участки памяти, в которые может быть записана какая-либо информация.

Необходимо обдумывать различия меж именованием переменной и ее значением. Если var1 — это имя переменной, то $var1 — это ссылка на ее значение.

Хотя, вышесказанное об отсутствии типа переменной можно оспорить, ибо переменные в bash делятся на Главные переменные (их же называю еще - глобальными, стандартными, переменные среды или внутренними) и пользовательские (которые определены пользователем во время работы). При всем этом, пользователь может переводит свою пользовательскую переменную в глобальную, с помощью команды export. Об других командах управления переменным можно почитать тут.

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

Переменные средЫ

Давайте побеседуем о переменных среды. Данные переменные, заданы в файлах /etc/.profile, ~/.profile, ~/.bashrc, ~/.bash_profile и инициализируются при загрузке, либо при выполнении команды ". .файл_инициализации". Обычно, главные значения переменных среды следующие:

$BASH

В переменной $BASH содержится полный путь до исполняемого файла командной оболочки Bash.

$BASH_VERSION

В переменную $BASH_VERSION записывается версия Bash.

$CDPATH

Переменная, которая хранит пути поиска каталога. (используется при вводе команды cd имя_каталога без слэша)

$CLASSPATH

содержит список каталогов для поиска файлов классов Java и архивов Java.

$HOME

домашний каталог текущего пользователя.

Переменные Linux

$HOSTNAME

В переменной $HOSTNAME хранится имя компьютера.

$HISTSIZE

количество событий, хранимых в истории за Один сеанс

$HISTFILE

Размещение файла истории событий

$HISTFILESIZE

количество событий, хранимых в истории меж сеансами

$IFS

переменная хранит знаки, являющиеся разделителями команд и черт. (по умолчанию - пробел, табуляция и новая строка)

$LANG

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

$MAIL

Введение в GNU/Linux. Семетстр 2, лекция 4. 2013/03/23

Место, где храниться почта

$OSTYPE

В переменной $OSTYPE содержится описание операционной системы.

$PATH

список каталогов для поиска команд и приложений, когда полный путь к файлу не задан.

$PS1

PS1 употребляется как основная строка приглашения. (то самое [root@proxy ~]#)

$PS2

PS2 употребляется как вторичная строка приглашения.

$PROMPT_COMMAND

Эта команда должна быть выполнена до отображения строки приглашения Bash.

$PWD

полный путь к текущему рабочему каталогу.

$SHELL

полный путь к текущей командной оболочке.

$USER

В переменной $USER содержится имя текущего пользователя.

Переменные пользователя

Присвоение значения переменной

Пользовательские переменные появляются, как пользователь "объявит" данную переменную, другими словами присвоит переменной какое-то значение:

$ var="123   345"       # Присваивание значения переменной # Если в значениях переменных встречаются пробелы, # то внедрение кавычек обязательно, по другому - можно без кавычек. $ variable=$var         # Подстановка значения переменной #------------------------------------------------------------------------- # Внедрение пробельных символов #  с обеих сторон знака "=" присваивания недопустимо. # Если записать "VARIABLE =value", #  то интерпретатор попробует выполнить команду "VARIABLE" с параметром "=value". # Если записать "VARIABLE= value", #  то интерпретатор попробует установить переменную окружения "VARIABLE" в "" #  и выполнить команду "value". #------------------------------------------------------------------------- $ echo var              # Это НЕ вывод переменной var $ echo $var 100 20 три 345 $ echo $variable 100 20 три 345 $ echo "$variable" 100 20 три   Триста 40 5 # Как видно, внедрение кавычек при выводе значения переменной сохраняет # пробельные знаки в переменной $ echo '$variable' $variable $ echo \$variable $variable # Внутри одинарных кавычек не делается подстановка значений переменных, #  т.е. "$" интерпретируется как обыденный символ. А так же при использовании #  знака экранирования. $ variable=            # Запись пустого значения в переменную(!но не удаление) $ echo $variable
#  Обратите внимание: запись пустого значения — это не то же самое, #   что сброс переменной, хотя конечный результат — тот же (см. ниже). $ echo "uninitialized_variable = $uninitialized_variable" uninitialized_variable = #пустое # Неинициализированная переменная содержит "пустое" значение. $ unset uninitialized_variable    # Сброс переменной. $ echo "uninitialized_variable = $uninitialized_variable" uninitialized_variable = #пустое

Деяния над переменными

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

$ readonly variable    # пометка переменной "только для чтения" $ variable=789 -bash: variable: доступная только на чтение переменная $ cat test             #содержимое первого скрипта #! /bin/bash variable1=znachenie    #объявление переменной echo "test 1: $variable1"      #вывод переменной ./subtest              #запуск вложенного скрипта echo "test 2: $variable1"           #вывод переменной после запуска вложенного скрипта export variable1       #экспорт переменной echo "test 3: $variable1" ./subtest echo "test 4: $variable1" $ cat subtest          #содержимое скрипта, запускаемого из первого #! /bin/bash echo "subtest 1: $variable1" variable1=drugoe echo "subtest 2: $variable1" $ ./test               #запуск скрипта test 1: znachenie subtest 1: subtest 2: drugoe test 2: znachenie test 3: znachenie subtest 1: znachenie subtest 2: drugoe test 4: znachenie $ cat where where=$(pwd) echo "Вы работаете в каталоге 1: $where" echo "Вы работаете в каталоге 2: $(pwd)" where2=`pwd` echo "Вы работаете в каталоге 3: $where2" # Как видно, переменной можно присвоить значение вывода какой-либо команды # используя комбинацию $(command) или `command` (апострофы). $ ./where Вы работаете в каталоге 1:  /home/user Вы работаете в каталоге 2:  /home/user Вы работаете в каталоге 3: /home/user

Особые переменные (Позиционные переменные)

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

Переменные Linux
# Рассмотрим содержимое командного сценария $ cat display_arg #! /bin/bash echo "Имя запущенного сценария: $0" echo "1-ые 5 аргументов командной строки: $1 $2 $3 $4 $5" echo "Всего аргументов сценария: $#" echo "Все аргументы у запущенного сценария: $*" echo "Если аргументов более 10, то выводим 10 так: ${10}" echo "PID запущенного сценария: $$" sleep 5 & echo "PID последнего процесса, запущенного в фоне: $!" ls display_ echo "Команда ls display_ завершилась статусом: $?" ls display_arg echo "Команда ls display_arg завершилась статусом: $?" # Запустим сценарий $ ./display_arg Один 98 kjk Девяносто восемь njk88 kjkj 70 восемь kjkj66 jkj k l h Имя запущенного сценария: ./display_arg 1-ые 5 аргументов командной строки: Один 98 kjk Девяносто восемь njk88 Всего аргументов сценария: Двенадцать Все аргументы у запущенного сценария: Один 98 kjk Девяносто восемь njk88 kjkj 70 восемь kjkj66 jkj k l h Если аргументов более 10, то выводим 10 так: k PID запущенного сценария: Три тыщи триста шестнадцать PID последнего процесса, запущенного в фоне: Три тыщи триста семнадцать ls: нереально получить доступ к display_: Нет такого файла или каталога Команда ls display_ завершилась статусом: Два display_arg Команда ls display_arg завершилась статусом: Нуль $

Из приведенного скрипта видно, что:

$0

хранит имя команды, запустившей сценарий

$1-$n

переменные хранят 1, 2, 3,...n позицию аргументов команды

$#

хранит количество аргументов команды

$*

хранит значение всех аргументов командной строки через пробел

$@

хранит значение всех аргументов командной строки в виде списка

$$

хранит PID запущенного сценария (процесса)

$!

хранит значение PID последнего процесса, запущенного в фоне

$?

Статус выхода запущенной последней программы. Он так же называется кодом условия, кодом возврата. По соглашению, ненулевое значение статусы окончания соответствует значению false и обозначает неудачное окончание процесса. Код выхода равный Нуль соответствует true и обозначает успешное окончание программы. (в нашем примере ls display_ завершилось с ошибкой и кодом выхода 2, т.к. файла или каталога display_ не существует)

Деяния над переменными 2

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

$ cat set_shift #! /bin/bash echo "var1=$1   var2=$2         var3=$3" shift echo "var1=$1   var2=$2         var3=$3" shift echo "var1=$1   var2=$2         var3=$3" shift echo "var1=$1   var2=$2         var3=$3"
echo "Посмотрим как присваиваются переменные командой set" set как это присваивается echo "Вот $1 $3 $2" $ ./set_shift mama papa dom var1=mama       var2=papa               var3=dom var1=papa       var2=dom                var3= var1=dom        var2=           var3= var1=   var2=           var3= Посмотрим как присваиваются переменные командой set Вот как присваивается это $

Как видно, команда shift "сдвигает" позиционные свойства, в конечном итоге чего свойства "сдвигаются" на одну позицию на лево.

X <- $1, $1 <- $2, $2 <- $3, $3 <- $4, и т.д.

Прежний аргумент $1 теряется, но аргумент $0 (имя файла сценария) остается без конфигураций.

Команда set устанавливает позиционные переменные на базе переданных ей аргументов, разбитых пробелами. Соответственно, команде set может быть передать в виде аргументов и вывод какой-либо команды в виде set $(command). Свойства команды set можно посмотреть тут.

P.S. Забыл указать на такой момент.Не считая использования ссылки на переменную в формате $имя_переменной, возможен и такой синтаксис: ${имя_переменной}. Данный синтаксис позволяет соединить переменную с другим текстом. Пример:

server:~# var10=alex server:~# echo $var10ander
server:~# echo ${var10}ander alexander

Как видно в примере, при попытке вывести значение переменной $var10ander выводится пустая строка, и правильно, потому что такой переменной нет. при заключении переменной в фигурные скобки - значение переменной объединяется с последующим текстом.

Резюме

На сегодня это все. Думаю представление о том, как работают переменные в bash, я выложил понятно. Желаю для вас побольше практики! #image.jpg

Желаю сказать спасибо товарисчу - начальнику бога http://poplinux.ru/ за некоторые процитированные в статье примеры.

Похожие статьи

  • Настройка cron планировщика в Linux

    В прошлой теме о демоне syslogd и команде logrotate, я упоминал о планировщике Linux - cron. На данный момент в своем блоге я более кропотливо расскажу о работе данного планировщика.cronПланировщик зад...

  • Постоянные выражения, базы для работы в Linux

    Неплохого времени, гости!В сегодняшней статье желаю коснуться такой большой темы как Неизменные выражения. Думаю всем понятно, что тема регексов (так неизменные выражения называются на сленге) - неох...

  • Главные команды Linux

     Версия для печатиНе мог не затронуть в блоге данную тему. В данной статье обрисую то, что есть на просторах интернета в больших количествах. Наверняка, в главном делаю это для себя, в виде шпаргалки....

  • Программные каналы и потоки Linux (UNIX), перенаправление потоков

    Неплохого времени, читатели моего блога!В данной статье желаю систематизировать свои зания по основным механизмам работы программных потоков и каналов в интерпретаторе и в общем в ОС Linux, а так ж...

  • Управление бесом syslogd и журналированием в Linux

    На данный момент на речь пойдет о журналировании в Linux. Функция системного журналирования (т.н. "логи" или логирование) - это основной источник инфы о работе системы и ошибках. Журналирование может осущ...

Теги: ос linux, ос
Рейтинг: +5 Голосов: 14 2606 просмотров
Комментарии (0)

Нет комментариев. Ваш будет первым!

Найти на сайте: параметры поиска

Windows 7

Среда Windows 7 на первых порах кажется весьма непривычной для многих.

Windows 8

Если резюмировать все выступления Microsoft на конференции Build 2013.

Windows XP

Если Windows не может корректно завершить работу, в большинстве случаев это

Windows Vista

Если к вашему компьютеру подключено сразу несколько мониторов, и вы регулярно...