TGViewer
LinuxCamp | DevOps LinuxCamp | DevOps @linuxcamp_tg · 13.6K subscribers
Post #157 6.57K
Вычисление переменных и развеивание заблуждений

Мы с вами уже как-то говорили про суть переменных оболочки и окружения. Сегодня рассмотрим оператор $, который позволяет определить значение переменной.

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

Самый простой способ увидеть, как оболочка обрабатывает символ — запустить команду 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
  • 👍 37
  • 🔥 23
  • ❤‍🔥 4
More from @linuxcamp_tg
  1. Sep 28, 2026Проекту GNU вчера исполнилось 43 года 1983 год: Ричард Столлман объявил планы разработать…
  2. Sep 25, 2026Linux будет работать на ноутах с Snapdragon X2. Qualcomm добавляет полноценную поддержку L…
  3. Sep 24, 2026Так все по делу)) Советует же самый быстрый фикс LinuxCamp | #memes
  4. Sep 23, 2026Планы на 3 октября — прийти на RWB Infra x Security Meetup Мы направим прожекторы на инфра…
  5. Sep 22, 2026Ещё одна рекордная неделя для AI-разработки в Linux. На прошлой неделе в ядро попало 1 634…
  6. Sep 17, 2026Открыл плейлист, а как выйти - непонятно 😁 LinuxCamp | #memes
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →