Восклицательный знак и решетка в фигурных скобках в bash

Я пытаюсь понять скрипт bash и У меня проблема со следующей строкой:

result=${!#}

Я нашел часть решения (! внутри ${}) здесь:

Если первым символом параметра является восклицательный знак (!), он вводит уровень косвенной переменной. Bash использует значение переменной, образованное из остатка параметра, в качестве имени переменной; затем эта переменная расширяется, и это значение используется в остальной части подстановки, а не значение самого параметра. Это известно как непрямое расширение.

Другая часть решения (# внутри ${}) находится здесь :

Подставляется длина в символах развернутого значения параметра. Если параметр — «» или «@», подставляемое значение — это количество позиционных параметров. Если параметр представляет собой имя массива с индексом «» или «@», подставляемое значение представляет собой количество элементов в массиве. Если параметр представляет собой имя индексированного массива с отрицательным индексом в индексе, это число интерпретируется как относительное на единицу большее, чем максимальный индекс параметра, поэтому отрицательные индексы отсчитываются от конца массива, а индекс -1 ссылается на последний элемент.

Но я не знаю, как эти два объединяются в result. Что делает эта строка?


person Lewistrick    schedule 23.01.2020    source источник


Ответы (1)


${#} — это количество аргументов в текущей оболочке/функции:

$ set -- a b c
$ echo ${#}
3

! выполняет косвенное расширение параметра, поэтому значение ${#} используется в качестве имени параметра для расширения.

$ echo ${!#}  # same as echo ${3}
c

Короче говоря, ${!#} расширяется до значения последнего аргумента.


В отсутствие таких расширений bash можно было бы просто написать цикл, например

for result; do :; done  # instead of result=${!#}

который будет перебирать позиционные аргументы, устанавливая result для каждого по очереди, оставляя result со значением последнего после завершения цикла.

person chepner    schedule 23.01.2020