Вычисление переменных и развеивание заблуждений
Мы с вами уже как-то
говорили про суть переменных оболочки и окружения. Сегодня рассмотрим оператор
$, который позволяет определить значение переменной.
Когда командная оболочка вычисляет переменную, определяет ее значение и подставляет его вместо имени. Чтобы выполнить задачу, нужно просто поставить знак
$ перед именем.
Самый простой способ увидеть, как оболочка обрабатывает символ — запустить команду
echo, которая выводит свои аргументы (после того, как оболочка завершит их вычисление):
$ echo My name is $USER and my files are in $HOME
My name is xoadmin and my files are in /home/xoadmin
$ echo ch*ter9
chapter9
Когда вы выводите на экран значение переменной с помощью команды
echo, вы можете подумать, что сама команда проверяет переменную и выводит ее значение.
На самом деле это не так, команда ничего не знает о переменных. Она просто выводит на экран любые аргументы, которые вы ей передаете. Значения для
HOME и
USER вычисляет оболочка перед запуском команды.
Вы можете определить или изменить переменную в любое время, используя следующий синтаксис:
name=value
Например, если вы часто работаете с каталогом "
Projects" внутри домашней директории, вы можете присвоить его имя переменной:
$ work=$HOME/Projects
И использовать его как удобное сокращение при работе с
cd:
$ cd $work
$ pwd
/home/xoadmin/Projects
Вы можете передавать
$work любой команде, ожидающей имя каталога, в качестве аргумента:
$ cp myfile $work
$ ls $work
Myfile
Вообще, этот принцип важно понять: оболочка вычисляет переменные, шаблоны и другие конструкции перед выполнением команды.
Шаблоны vs переменные
Предположим, вы хотите перенести ряд файлов с расширением "
.txt" из одного каталога в другой.
Вот два способа сделать это, но один работает, а другой нет:
# Метод 1
$ mv dir1/*.txt dir2
# Метод 2
$ FILES="file1.txt file1.txt"
$ mv dir1/$FILES dir2
Метод 1 работает, потому что шаблон соответствует всему пути к файлу — имя каталога
dir1 является частью совпадений:
$ echo dir1/*.txt
dir1/file1.txt dir1/file2.txt
Таким образом, метод 1 работает так, как если бы вы набрали следующую команду:
$ mv dir1/file1.txt dir1/file2.txt dir2
В методе 2 используются переменные, имеющие только свои буквальные значения, и нет специального инструмента для вычисления путей к файлам:
$ echo dir1/$FILES
dir1/file1.txt file2.txt
Следовательно, метод 2 работает так, как если бы вы набрали следующую команду:
$ mv dir1/file1.txt file2.txt dir2
/bin/mv: cannot stat 'file2.txt': No such file or directory
🐧 LinuxCamp