Переменные делают скрипт более гибким, позволяют уйти от жестко привязанных значений. Переменная по сути представляет некоторый идентификатор или имя, с которым связано некоторое динамическое значение, и это значение может меняться в течение работы программы.
Для определения переменных применяется следующий синтаксис:
имя_переменной=значение_переменной
Например:
message="Hello METANIT.COM"
Здесь определяется переменная message, значением которой является строка "Hello METANIT.COM".
Для обращения к переменной используется ее имя, перед которым ставится символ $. Например, вывод значения переменной с помощью команды echo:
echo $message
Причем определять переменные и работать с ними мы можем как в shell-скрипте, так и непосредственно в консоли:
eugene@Eugene:~$ message="Hello METANIT.COM" eugene@Eugene:~$ echo $message Hello METANIT.COM eugene@Eugene:~$
Стоит отметить, что система при загрузке уже устанавливает ряд глобальных переменных - переменных окружения. Эти переменные можно получить с помощью команды env:
eugene@Eugene:~$ env SHELL=/bin/bash GNOME_SHELL_SESSION_MODE=ubuntu XMODIFIERS=@im=ibus DESKTOP_SESSION=ubuntu GTK_MODULES=gail:atk-bridge PWD=/home/eugene LOGNAME=eugene XDG_SESSION_DESKTOP=ubuntu XDG_SESSION_TYPE=wayland HOME=/home/eugene USERNAME=eugene USER=eugene ........................... eugene@Eugene:~$
Например, среди переменных устанавливается глобальная переменная USER, которая хранит имя текущего пользователя. Выведем ее значение на консоль:
eugene@Eugene:~$ echo $USER eugene eugene@Eugene:~$
Аналогичным образом мы можем работать с несколькими переменными. Например, определим следующий shell-скрипт:
#!/bin/bash # скрипт, который определяет переменные NAME и AGE и выводит их на консоль NAME="Tom" AGE=39 echo $NAME echo $AGE exit 0
Здесь определяются две переменных: NAME и AGE, и затем их значения выводятся на консоль. Запустим скрипт:
eugene@Eugene:~$ bash hello Tom 39 eugene@Eugene:~$
Отличительной особенностью переменных является то, что мы можем менять их значения. Например, определим следующий скрипт:
#!/bin/bash # скрипт динамически изменяет значение переменной message="Hello METANIT.COM" echo $message message="Hello World" echo $message exit 0
В данном случае два раза устанавливаем значение переменной message и после второй установки повторно выводит значение переменной на консоль. Запустим скрипт:
eugene@Eugene:~$ bash hello Hello METANIT.COM Hello World eugene@Eugene:~$
При определении переменных следует помнить, что переменная определяется только для текущей оболочки. Это означает, что если вы запустите подоболочку из текущей оболочки, переменной там не будет. А если вы определите переменную в подоболочке, то эта переменная не будет доступна для родительской оболочки - как только вы выйдете из подоболочки и вернетесь в родительскую оболочку, переменной там уже не будет. Например, возьмем следующий скрипт:
#!/bin/bash echo $message exit 0
Данный скрипт выводит значение переменной message, но НЕ определяет эту переменную. Предполагается, что что переменная будет определяться где-то извне. В консоли установим переменную message и запустим скрипт с помощью команды bash:
eugene@Eugene:~$ message="Hello METANIT.COM" eugene@Eugene:~$ echo $message Hello METANIT.COM eugene@Eugene:~$ bash hello eugene@Eugene:~$ echo $message Hello METANIT.COM eugene@Eugene:~$
Сначала для текущей оболочки устанавливаем переменную message и выводим ее на консоль. Далее команда bash hello
запускает скрипт hello в новой подоболочке.
И мы видим, что команда echo из скрипта выводит пустоту, так как для нее недоступна переменная message из родительской оболочки. Причем после завершения скрипта и соответственно закрытия его подоболочки
мы по прежнему можем использовать переменную message.
Чтобы сделать переменную родительской оболочки доступной для всех дочерних подоболочек, такая переменная должна быть определена с помощью команды export:
eugene@Eugene:~$ export message="Hello METANIT.COM" eugene@Eugene:~$ echo $message Hello METANIT.COM eugene@Eugene:~$ bash hello Hello METANIT.COM eugene@Eugene:~$ echo $message Hello METANIT.COM eugene@Eugene:~$
Если надо сделать, чтобы переменные были доступны глобально, всегда даже после перезагрузки компьютера, то их следует добавить в переменные среды.
Расспространенной техникой при работе с переменными является их встраивание (sourcing) в текущую оболочку. В этом случае переменные часто определяются в одном файле. Например, определеим в домашнем каталоге файл vars со следующим содержимым:
#!/bin/bash name="Tom" age=39 email="tom@mimimail.com"
Здесь определены три переменных. Встроим файл в консоль и обратимся к переменным:
eugene@Eugene:~$ . vars eugene@Eugene:~$ echo $name Tom eugene@Eugene:~$ echo $age 39 eugene@Eugene:~$ echo $email tom@mimimail.com eugene@Eugene:~$
Первая команда - . vars
собственно представляет встраивание содержимого файла в консоль, после чего мы сможем обращаться к переменным.
С помощью команды read можно получить от пользователя некоторые данные в некоторую переменную. Например, определим следующий скрипт hello:
#!/bin/bash # скрипт, который считывает пользовательский ввод в переменную NAME echo Enter your name: read NAME echo -e "Your name:\t $NAME" exit 0
Здесь вначале команда echo
выводит приглашение к вводу имени. Затем с помощью команды read NAME
вводимые данные передаются в переменную NAME.
Затем выводим имя. Причем при выводе используем табуляцию - "\t". Чтобы данная последовательность трактовалась именно как табуляция, команда echo применяет опцию -e
Запустим скрипт:
eugene@Eugene:~$ bash hello Enter your name: Eugene Your name: Eugene eugene@Eugene:~$
После вывода приглашения к вводу мы можем ввести некоторые данные, и они попадут в переменную NAME.