Залежно від конкретної ситуації, це явно не визначено (тому реалізація може виконуватись, як вони будуть), або вимагається, як це відбулося, як ви спостерігали. У вашому точному сценарії 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;}
(який відрізняється від стандартного$(...)
тим, що не виконує команди в підпакеті).