[Video] v20.16 Bash скрипты. Переменные в bash скриптах. Утилита read.

Это очередное, уже шестнадцатое видео о написании скриптов в коммандной оболочке – bash scripting.

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

Итак – что такое переменная?
Переменная в самом простом представлении это область памяти в которой можно хранить какие-либо данные.
На текущий момент для нас переменная это некое пространство в котором мы будем хранить различные последовательности символов и чисел.

Вообще,в отличие от многих языков программирования, Bash не разделяет переменные по их «типу». В основном, переменные Bash являются символьными строками. Bash допускает арифметические операции и операции сравнения над переменными, преобразуя строку в число. Определяющим фактором является – содержит ли значение переменной только цифры.

Есть ещё несколько выжных вещей которые необходимо знать о переменных:
– имя переменной может начинаться с буквы или символа подчёркивание;
– имя переменной не может начинасть с цифры;
– имя переменной чувствительно к регистру – переменные a и A это две разные переменные!
– нельзя использовать запятые и пробелы в имени переменной.

~/mytest.dir$ a=2
~/mytest.dir$ echo $a
2

~/mytest.dir$ _b=3
~/mytest.dir$ echo $_b
3

~/mytest.dir$ 1f=5
1f=5: command not found

~/mytest.dir$ a=2
~/mytest.dir$ A=3
~/mytest.dir$ echo $a
2
~/mytest.dir$ echo $A
3

~/mytest.dir$ e,e=4
e,e=4: command not found

Создам тестовый файл:
~/mytest.dir$ nano script.sh
и добавлю следующее содержимое:
# This is a script about read utility.
echo "Please, enter your name!"
read var_name
echo "Hello $var_name, nice to meet You!"

Итак, сначала идёт строка с комментарием – просто для наглядности, приучаем себя писать комментарии – с ними проще понять о чём скрипт, что он должен делать и тп.
Следующая строка read var_name. Утилита read – в данном случае она считывает данные со стандартного ввода и записывает эти данные в переменную с именем var_name.
Далее производится вывод неких данных с использованием утилиты echo, но помимо текста, будет выведено содержимое переменной. Для того чтобы утилита вывела содержимое переменной необходимо указать имя переменной и перед именем поставить знак $.
Если есть желание написать какой-либо текст в котором будет символ $ и он отображался как $, то вместо кавычек нужно поместить содержимое между двух апострофов.

Давайте сначала проверим что будет в выводе текущего скрипта (скрипт является интерактивным):
:~/mytest.dir$ bash script.sh
Please, enter your name!
sasha
Hello sasha, nice to meet You!

Теперь добавим следующую строку и проверим вывод скрипта:
echo 'Hello $var_name, nice to meet You!'

:~/mytest.dir$ bash script.sh
Please, enter your name!
sasha
Hello sasha, nice to meet You!
Hello $var_name, nice to meet You!

Данный простой скрипт можно немного переписать. Например, мне хочется, чтобы я вводил переменную в той же строке, что и текст предваряющий его.
Данный скрипт можно переписать следующим образом.
Вместо первой строки с утилитой echo можно воспользоваться ключом -p у утилиты read:

-p prompt output the string PROMPT without a trailing newline before attempting to read

Скрипт будет выглядить следующим образом:
read -p "Please, enter your name here: " var_name
echo "Hello $var_name, nice to meet You!"

Ещё раз вернусь к переменным. Безусловно значения переменным можно задавать не только самостоятельно вводя руками. Переменную можно задать непосредственно в теле скрипта, например, как некий базис или основу. В данном скрипте смысла в ней особого нет, но я хочу просто показать вам этот пример. Он пригодится в будущем.
~/mytest.dir$ cat script-v2.sh
# simple variable
a=12
b=4
echo "Variable a=$a, b=$b."

Запущу скрипт:
~/mytest.dir$ bash script-v2.sh
Variable a=12, b=4.

Принцип работы прост – объявляются две переменные и им присваиваются значения, затем выводится текст и содержимое переменных.
Как видно для интерпритатора буква а-это просто буква, а $a это уже содержимое переменной.

Так же значения переменным могут присваиваться в процессе выполнения скрипта, например, вычисляя их в процессе работы скрипта. Об этом я расскажу позже.

На сегодня всё.
Удачи!

Sources:
Shell Script, read on same line after echoing a message.
Переменные Bash не типизированы.
3
4