Этот ответbash
-специфичен, потому что вы попробовали echo
в bash
. Не все оболочки ведут себя одинаково.
В bash
если $var1
равно foo
, то ${!var1}
совпадает с $foo
. !
является косвенным расширением :, оно заставляет bash
извлекать из данной переменной имя переменной(foo
)вместо значения .
Теперь замените var1
на #
. $#
— количество аргументов. Если $#
равно 0, ${!#}
равно $0
. Если $#
равно 4, ${!#}
равно $4
. Другими словами, ${!#}
— это последний позиционный параметр, независимо от того, сколько там позиционных параметров.
Если нет позиционных параметров, $#
равно 0
, поэтому результатом будет $0
, которое является именем оболочки или скрипта(ссылка). В вашем случае этоbash
(плюс ведущий -
, означающий, что это оболочка входа в систему ).
Быстрый тест:
$ echo ${!#}
-bash
$ set the quick brown fox
$ echo ${!#}
fox