Восклицательный знак и га sh в фигурных скобках в bash - PullRequest
1 голос
/ 23 января 2020

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

result=${!#}

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

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

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

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

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

1 Ответ

5 голосов
/ 23 января 2020

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

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

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

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

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


В отсутствие таких расширений bash можно просто напишите al oop наподобие

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

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

...