Unix / Linux - Механизмы цитирования shell

Здравствуйте,野心勃勃的程序设计师们! Сегодня мы окунемся в fascinирующий мир механизмов цитирования shell в Unix и Linux. Как ваш доброжелательный сосед-педагог по компьютерам, я здесь, чтобы провести вас через это путешествие, шаг за шагом. Не волнуйтесь, если вы никогда раньше не программировали - мы начнем с самых азов и будем продвигаться вверх. Так что возьмите себе кружку кофе (или чая, если это ваше дело), и давайте начнем!

Unix / Linux - Quoting Mechanisms

Метасимволы

Before мы перейдем к цитированию, нам нужно понять, что такое метасимволы. В shell метасимволы - это особые символы, которые имеют уникальное значение. Они как специи в вашем любимом блюде - немного goes a long way!

Вот таблица.common метасимволов:

Метасимвол Знание
* Wilcard (подходит для любого количества символов)
? Wilcard (подходит для любого одного символа)
> Перенаправление вывода
< Перенаправление ввода
& Выполнение команды в фоновом режиме
; Разделитель команд
() Группировка команд
[] Класс символов

Давайте посмотрим на пример:

ls *.txt

В этой команде * - это метасимвол. Он говорит shell, чтобы он перечислил все файлы, оканчивающиеся на .txt. Pretty neat, right?

Но что, если мы действительно хотим использовать эти символы в качестве обычных символов? Вот где comes citирование!

Одинарные кавычки

Одинарные кавычки - это simplest форма цитирования. Они говорят shell, чтобы он treated все, что находится внутри них, как literal символы. Это как putting ваши слова в защитную bubble!

Давайте попробуем пример:

echo 'The * is a wildcard character'

Вывод:

The * is a wildcard character

Смотри это? * не расширение для списков всех файлов. Он был обработан как обычный символ.

Одинарные кавычки великолепны, когда вы хотите сохранить literal значение каждого символа в строке. Даже другие символы цитирования теряют свое особое значение внутри одинарных кавычек!

echo 'This is a $VARIABLE with "double quotes" inside'

Вывод:

This is a $VARIABLE with "double quotes" inside

Все, что находится внутри одинарных кавычек, выводится exactly как есть. Никаких подстановок, никаких интерпретаций. Просто чистый, не тронутый текст!

Двойные кавычки

Двойные кавычки гибче, чем их одинарные cousins. Они сохраняют literal значение большинства символов, но все еще позволяют некоторые подстановки. Это как semi-permeable membrane для вашего текста!

Вот что позволяют двойные кавычки:

  1. Подстановка переменных
  2. Подстановка команд
  3. Escaping обратной косой черты

Давайте рассмотрим несколько примеров:

NAME="Alice"
echo "Hello, $NAME!"

Вывод:

Hello, Alice!

Переменная $NAME была подстановлена со своим значением. Magic!

Теперь давайте попробуем подстановку команды:

echo "Today's date is $(date)"

Вывод:

Today's date is Tue May 23 10:30:45 PDT 2023

Часть $(date) была заменена выводом команды date. Isn't that cool?

Но помните, что некоторые символы все еще retain их special значение внутри двойных кавычек:

echo "This is a newline: \n And this is a tab: \t"

Вывод:

This is a newline:
And this is a tab:

\n и \t были интерпретированы как перевод строки и tab соответственно.

Обратные кавычки

Обратные кавычки, также известные как backticks, - это старая форма подстановки команд. Они как time travelers из early days Unix!

Вот как они работают:

echo "The current directory contains `ls | wc -l` files"

Вывод:

The current directory contains 42 files

Команда между обратными кавычками (ls | wc -l) выполняется, и ее вывод подставляется в строку.

Хотя обратные кавычки все еще работают, более modern $() синтаксис обычно preferred:

echo "The current directory contains $(ls | wc -l) files"

Это делает то же самое, но easier для nesting и, на мой скромный взгляд, easier для чтения. Это как upgrade с flip phone до smartphone - та же базовая функция, но much более user-friendly!

Combining It All Together

Теперь, когда мы explored все эти механизмы цитирования, давайте combine их в fun little script:

#!/bin/bash

NAME="World"
GREETING='Hello'
DATE=$(date +"%A, %B %d, %Y")

echo "$GREETING, $NAME!"
echo 'Today is not actually $DATE'
echo "But for real, today is $DATE"
echo "There are `ls | wc -l` files in this directory"

Если мы запустим этот скрипт, мы можем получить вывод как:

Hello, World!
Today is not actually $DATE
But for real, today is Tuesday, May 23, 2023
There are 42 files in this directory

Можете ли вы увидеть, как каждый тип цитирования влияет на вывод? Одинарные кавычки сохраняют все literally, двойные кавычки позволяют подстановки, и обратные кавычки (или $()) выполняют подстановку команд.

And there you have it, folks! You've just taken your first steps into the world of shell quoting mechanisms. Remember, practice makes perfect, so don't be afraid to experiment with these concepts. Before you know it, you'll be quoting like a pro!

Happy coding, and may the shell be with you! ??

Credits: Image by storyset