Будь-яка з вкладених конструкцій, яка може бути інтерпольована всередині рядків, може мати додаткові рядки всередині них: вони розбираються як новий сценарій, аж до маркера закриття, і навіть можуть бути вкладені кілька рівнів глибоко. Весь рядок із них починається з значка "a" $
. Усі вони задокументовані у поєднанні посібника Bash та специфікації мови командної оболонки POSIX.
Є кілька випадків цих конструкцій:
Заміна команд на$( ... )
, як ви знайшли. POSIX визначає таку поведінку :
З $(command)
формою всі символи, що слідують за відкритими дужками на відповідні дужки, що закриваються, складають команду. Будь-який дійсний скрипт оболонки може бути використаний для команди ...
Котирування є частиною дійсних скриптів оболонки, тому їм дозволено їх нормальне значення.
- Підстановка команд також використовується
`
.
Елемент "word" розширених екземплярів заміни параметрів, таких як${parameter:-word}
. Визначення «слова» є :
Послідовність символів, оброблених оболонкою як одиниця
- який включає цитований текст і навіть змішані цитати a"b"c'd'e
- хоча реальна поведінка розширень трохи ліберальніша, ніж це, наприклад, також ${x:-hello world}
працює.
Арифметичне розширення за допомогою $(( ... ))
, хоча там значною мірою марно (але ви також можете вкладати підстановку команд або змінні розширення, а потім мати цитати з користю всередині них). POSIX стверджує, що :
Вираз трактується так, ніби він був у подвійних лапках, за винятком того, що подвійне цитування всередині виразу не трактується спеціально. Оболонка повинна розширювати всі лексеми у виразі для розширення параметрів, підстановки команд та видалення цитат.
тому така поведінка прямо вимагається. Це означає echo "abc $((4 "*" 5))"
арифметику, а не глобус.
Зауважте, що $[ ... ]
арифметичне розширення старого стилю не трактується однаково: цитати будуть помилками, якщо вони з’являються, незалежно від того, розширюється котирування чи ні. Ця форма більше не задокументована і не призначена для використання в будь-якому випадку.
- Специфічний для локального перекладу текст
$"..."
, який фактично використовує "
як основний елемент. $"
трактується як єдине ціле.
Є ще один випадок гніздування, якого, можливо, ви не очікуєте, не залучаючи цитати, що з розширенням дужок : {a,b{c,d},e}
розширюється до "a bc bd e". ${x:-a{b,c}d}
робить НЕ гніздо, однак; це трактується як заміна параметра, що дає " a{b,c
", а потім " d}
". Це також документально підтверджено :
Коли використовуються дужки, відповідна кінцева дужка є першою '}', не уникнутою зворотною косою рисою або в цитованому рядку, а також не вбудованим арифметичним розширенням, підстановкою команд або розширенням параметрів.
Як правило, всі розмежовані конструкції аналізують свої тіла незалежно від оточуючого контексту (а винятки трактуються як помилки ). По суті, побачивши $(
код підстановки команд, просто просить аналізатор споживати те, що він може від тіла, як ніби це нова програма, а потім перевіряє, чи з'являється очікуваний кінцевий маркер (незмінений )
або ))
або }
), як тільки запущений підпараметр з речей, які він може споживати.
Якщо ви думаєте про функціонування аналізатора рекурсивно-десантного зниження , це просто проста рекурсія на базовий випадок. Це насправді зробити простіше, ніж іншим способом, як тільки ти взагалі маєш рядкову інтерполяцію. Незалежно від основної методики розбору, оболонки, що підтримують ці конструкції, дають однаковий результат.
Ви можете вкласти цитати так глибоко, як вам подобається, через ці конструкції, і це буде працювати, як очікувалося. Ніде не заплутаєтесь, побачивши цитату посередині; натомість це стане початком нової цитованої рядки в інтер'єрному контексті.