Чому $ {$ #} повертає такий самий результат, як $$ в оболонці?


18

Намагаючись отримати останній встановлений позиційний параметр /bin/dash, я намагався echo ${$#}. Дивно, але це не призвело до помилки, але до PID, який є таким же, як $$зміст змісту. Питання: чому цей синтаксис працював? Яке синтаксичне правило, яке тут застосовано оболонкою?

В основному, те, що я зробив

$ set 1 2 3 4 5
$ echo ${$#}
13819
$ echo $$
13819

Мабуть, %персонаж також ігнорується в такій конструкції

$ echo ${$%}
13819

Але *і @привести до поганої помилку заміщення:

$ echo ${$*}
sh: 10: Bad substitution
$ echo ${$@}
sh: 11: Bad substitution

3
Що ви очікуєте ${$*}та ${$@}виробите?
Kusalananda

2
@Kusalananda Ніяких очікувань. Я намагався інші символи поруч #і %і які результати поведінки від тих.
Сергій Колодяжний

1
Для того, щоб на самому ділі опосередкованість в тирі, використання eval, наприклад dash -c 'set 1 2 3 4 5; eval "echo \$$#"'. Джерело: Ubuntu Wiki
wjandrea

1
@wjandrea Так, вже знаю про це. Насправді вже є питання про це: stackoverflow.com/questions/1853946/… Я намагався знайти метод самостійно, не читаючи спочатку питання (і я вже знав, що for i; do true; doneпотрібно отримати останній предмет $i), але шукав щось більш елегантне. evalЗвичайно, можуть виникнути потенційні проблеми, подумати, в якій мірі - це інша тема. Але так, це варіант
Сергій Колодяжний

Відповіді:


35

Це $$ видалено з порожнім префіксом :

${parameter#[word]}

Видаліть найменший шаблон префікса . Слово має бути розширено , щоб отримати шаблон. Потім розширення параметра приводить до параметра , при цьому найменша частина префікса, узгоджена з шаблоном, видаляється. Якщо це є, слово не повинно починатись без цитування #.

Те саме стосується %(суфікса). @і *не є модифікаторами розширення параметрів, тому вони є помилками. Бувало для $?, $-або гіпотетичний , $=а також. ${$+}це порожнє розширення.


Я мав би негайно розпізнати заміну параметрів там. Хороший улов.
Сергій Колодяжний
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.