Нежных много, деловых мало. Ну не могу я из песни слов выбросить, получится сухо и неинтересно.

Поэтому нарушать традиций не будем, продолжаем в том же ключе. А нежные пусть идут на… ну ты понял.

Рассмотрим распространённый случай:

echo $foo

Тут всё предельно ясно и понятно. Всё в ажуре!

Но это вершина айсберга. Эта команда может отрабатывать не так, как ты ожидаешь. Потому что foo — это переменная. И если ты её не возьмёшь в кавычки, то Bash может сделать с её содержимым всякие хитрые штуки.

Что подразумевается под «хитрыми штуками»

  • Разделить содержимое на отдельные слова (если там есть пробелы).
  • Подставить имена файлов с таким шаблоном, если он выглядит как *.zip (это называется глоббинг).

И тут у новичков возникает многочасовой проёб, когда переменная выводит неправильные значения.

Смотри:

msg="Пожалуйста, введите имя файла в формате *.zip"
echo $msg

Выглядит опять всё красиво. А по факту получаешь:

Пожалуйста, введите имя файла в формате awscliv2.zip

Да блядь! А я просто хотел вывести строкой *.zip, а не получить список файлов в текущей папке.

var="*.zip"
echo "$var"
echo $var
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Первое echo напечатает *.zip, а второе выведет список всех файлов, которые заканчиваются на .zip.

Поэтому, если ты хочешь наверняка вывести переменную как есть, лучше используй printf:

printf "%s\n" "$foo"

Для маленьких:

Представь, что ты говоришь падшей женщине: «покажи, что у тебя в трусах», она снимает трусы, а там — большой сочный хуй.

А чтобы в трусах был ожидаемый результат, нужно изначально это учесть в моменте знакомства (до просьбы) и расставить все кавычки.

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

Такие дела. Изучай!