Кавычки в bash
Вопрос
Объясни разницу между одинарными, двойными кавычками и их отсутствием в bash.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Одинарные: всё буквально, никаких подстановок
Двойные: работают `$var`, `$(cmd)`, `\`, но нет разбиения на слова и раскрытия масок
Без кавычек: подстановка, затем разбиение по IFS и раскрытие `*`, `?`
Поэтому переменные почти всегда пишут в двойных кавычках
`"$@"` сохраняет аргументы по отдельности, `"$*"` склеивает в одну строку
Что могут спросить следом
- Как вставить одинарную кавычку внутрь одинарных?
- Когда кавычки вокруг переменной не нужны?
Разбор
В одинарных кавычках bash ничего не трогает: '$HOME' останется как есть. В двойных работают подстановки переменных и команд, но результат остаётся одним словом: не режется по пробелам и маски в нём не раскрываются. Без кавычек после подстановки идёт разбиение по IFS и раскрытие масок, поэтому файл my report.txt превращается в два аргумента, а значение * в список файлов. Отсюда правило: переменные почти всегда в двойных кавычках. Исключения редкие: внутри [[ ]] и в присваивании a=$b разбиения нет. Для аргументов важен "$@": он раскрывается в исходные аргументы по отдельности, а "$*" склеивает всё в одну строку. Одинарную кавычку внутрь одинарных вставляют так: закрыть, экранировать, открыть, 'it'\''s', или через $'...'.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.