Залежно від конкретної ситуації, це явно не визначено (тому реалізація може виконуватись, як вони будуть), або вимагається, як це відбулося, як ви спостерігали. У вашому точному сценарії echo ab$, POSIX наказує висновок «аби $» , що ви спостерігали і це не визначено . Швидкий підсумок всіх різних випадків під кінець.
Є два елементи: спочатку маркірування на слова, а потім тлумачення цих слів.
Токенізація
Токенізація POSIX вимагає, щоб a, $що не є початком дійсного розширення параметра , підстановки команд або арифметичної заміни, вважати буквальною частиною побудованого WORDмаркера. Це відбувається тому, що правило 5 ("Якщо поточний символ є без котировки $або `, оболонка повинна ідентифікувати початок будь-яких кандидатів на розширення параметрів, підстановку команд або арифметичне розширення з їх вступних послідовностей без котирування символів: $або ${, $(або `, і $((відповідно" ) не застосовується, оскільки жодне з цих розширень не є життєздатним. Розширення параметра вимагає, щоб у ньому з’явилося дійсне ім’я, а порожнє ім’я недійсне.
Оскільки це правило не застосовується, ми продовжуємо дотримуватися, поки не знайдемо той, який має. Два кандидати - №8 ("Якщо попередній символ був частиною слова, до цього слова додається поточний символ.") Та №10 ("Початковий символ використовується як початок нового слова.") , які стосуються echo a$і echo $відповідно.
Існує також третій випадок форми, echo a$+bякий потрапляє через ту саму щілину, оскільки +це не назва спеціального параметра. Цей ми повернемося пізніше, оскільки він запускає різні частини правил.
Таким чином, специфікація вимагає, щоб це $було розглянуто як частину слова синтаксично, і воно може бути згодом оброблене.
Розширення слова
Після розбору введення таким чином, із $включеним у слово, розширення слів застосовуються до кожного прочитаного слова. Кожне слово обробляється індивідуально .
Вказано, що :
Якщо без котирування "$" супроводжується символом, який не є одним із наступних:
- Числовий символ
- Назва одного із спеціальних параметрів (див. Спеціальні параметри )
- Дійсний перший символ імені змінної
- A
<left-curly-bracket>('{')
- А
<left-parenthesis>
результат не визначений.
"Невизначений" - це конкретний термін, що означає це
- Відповідна оболонка може вибрати будь-яку поведінку в цьому випадку
- Відповідна програма не може покладатися на якусь конкретну поведінку
У вашому прикладі echo ab$, то $ не слід будь-якого символ , так що це правило не застосовується , і невизначений результат не викликається. Просто немає розширення, наштовхуваного на $, тому він буквально присутній і роздрукований.
Там , де вона буде застосовуватися в нашому третьому випадку зверху: echo a$+b. Тут $йде далі+ , що не є число, спеціальний параметр ( @, *, #, ?, -, $, !, або 0), початок змінного імені (підкреслення або літерним від портативного набору символів ), або один з кронштейнів. У цьому випадку поведінка не визначено: відповідної оболонці дозволяється вигадувати спеціальний параметр, покликаний +розширюватись , а відповідна програма не повинна припускати, що оболонка цього не робить . Оболонка може також робити все, що їй подобається, включаючи повідомлення про помилку.
Наприклад, zsh, включаючи його в режимі POSIX, інтерпретує $+bяк "мінливий bнабір" і замінює на його місці 1 або 0. Аналогічно має розширення для ~та =. Це відповідна поведінка.
Ще одне місце це може статися - це echo "a$ b". Знову оболонці дозволено робити так, як вона забажає, і ви як автор сценарію повинні уникати, $якщо ви хочете дослівного виводу. Якщо ви цього не зробите, це може спрацювати, але ви не можете на нього покластися. Це абсолютна літера специфікації, але я не думаю, що цей вид деталізації був призначений чи розглянутий.
Підводячи підсумок
echo ab$: дослівний вихід, повністю вказаний
echo a$ b: дослівний вихід, повністю вказаний
echo a$ b$: дослівний вихід, повністю вказаний
echo a$b: розширення параметра b, повністю вказане
echo a$-b: розширення спеціального параметра -, повністю вказане
echo a$+b: невказана поведінка
echo "a$ b": невказана поведінка
Для слова в $кінці слова вам дозволяється покладатися на поведінку, і до неї слід ставитися буквально і передаватися echoкоманді як частина її аргументу. Це вимога відповідності оболонці.
$набуває особливого значення, якщо це останній символ у слові?" Не присвоєно єдиного спеціального значення$; використовується для введення декількох, але відмінних розширень, таких як розширення параметрів${...}, підміна команд$(...)та арифметичні вирази$((...)). Деякі оболонки вводять додаткові контексти, наприклад,kshваріант підстановки командx=${ echo foo; echo bar;}(який відрізняється від стандартного$(...)тим, що не виконує команди в підпакеті).