начиная с документации https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html внизу страницы вы можете увидеть:
${parameter@operator}
The expansion is either a transformation of the value of parameter or information about parameter itself, depending on the value of operator. Each operator is a single letter:
Q The expansion is a string that is the value of parameter quoted in a format that can be reused as input.
E The expansion is a string that is the value of parameter with backslash escape sequences expanded as with the $'…' quoting mechanism.
P The expansion is a string that is the result of expanding the value of parameter as if it were a prompt string (see Controlling the Prompt).
A The expansion is a string in the form of an assignment statement or declare command that, if evaluated, will recreate parameter with its attributes and value.
a The expansion is a string consisting of flag values representing parameter’s attributes.
If parameter is ‘@’ or ‘*’, the operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with ‘@’ or ‘*’, the operation is applied to each member of the array in turn, and the expansion is the resultant list.
The result of the expansion is subject to word splitting and pathname expansion as described below.
Я прочитал этот раздел 20 раз вверх и вниз, вперед и назад, а такжесоответствующие разделы на ту же тему из справочника Bash Pocket.
Может быть, я слишком глуп, или, может быть, это потому, что английский - мой третий язык, но что это означает и какие практические приложения для этогосоглашение?
Если кто-то, кто уже работал с этим синтаксисом, мог бы пролить свет на это, это было бы очень признательно.
Заранее спасибо.
РЕДАКТИРОВАТЬ: [решено]
В дополнение к тому, что было раскрыто в разделе комментариев, я обнаружил следующие примеры ...
$ declare -A ARRAY
$ echo ${ARRAY@a}
[output empty]
$ echo ${ARRAY@A}
[output empty]
Приведенный выше код является причиной, по которой он очень труден и противоречитинтуитивно понятно "самому" понять, что должен делать этот синтаксис.
Однако при инициализации массива при объявлении (или после объявления, но перед применением). этот синтаксис):
$ declare -A ARRAY=([foo]=bar [up]=down)
$ echo ${ARRAY@a}
A
$ echo ${ARRAY[@]@A}
declare -A ARRAY=([foo]="bar" [up]="down" )
$ echo ${ARRAY[*]@A}
declare -A ARRAY=([foo]="bar" [up]="down" )
$ foo=bar
$ echo ${foo@A}
foo='bar'
Теперь это имеет смысл. Если $ {var @ a} возвращает «A» (заглавная A), вы знаете, что это, в частности, ассоциативный массив, если он возвращает «a», то это обычный / индексированный массив. Другая форма с $ {var @ A} возвращает строку, которая представляет, как была создана переменная, и для массивов, в частности, вам нужно , чтобы использовать дополнительные квалификаторы [@] или [*], что весьмане интуитивно понятен и пропускает примеры, которые вообще неочевидны, иначе вывод не будет работать должным образом.
$ {var @ a} может использоваться в тестах или сценариях. $ {var @ A} может использоваться в сценариях eval, наиболее вероятно (очень мощный).
$ foo=$'\'\'\''
$ echo ${foo}
'''
$ echo ${foo@Q}
''\'''\'''\'''
Форма $ {var @ Q} возвращает ту же строку, которая содержится в var, но с использованием $'...' соглашение о цитировании, которое может быть полезно для «безопасного» использования в подсказке или в выражениях eval.
$ foo='Hello\tWorld\nHow are you?'
$ echo "${foo}"
Hello\tWorld\nHow are you?
$ echo "${foo@E}"
Hello World
How are you?
Форма $ {var @ E} была наиболее трудной для понимания,потому что если вы не используете двойные кавычки вокруг foo ("$ {foo}", "$ {foo @ E}"), вы можете не заметить предполагаемые различия. Эта форма будет переводить внутренние escape-последовательности не как буквальные, а оцениваемые в соответствии с обычным синтаксисом printf (и более).
Форма с @P является очень, очень особенным случаем и достаточно объяснена пользователем "chepner"в комментариях. Спасибо за это!