Переменные и получение ввода

Последнее обновление: 23.03.2024

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

Для определения переменных применяется следующий синтаксис:

имя_переменной=значение_переменной

Например:

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.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850