Por que a página de manual do bash lê que parâmetros especiais "só podem ser referenciados; a atribuição a eles não é permitida"?

Por que a página de manual do bash lê que parâmetros especiais "só podem ser referenciados; a atribuição a eles não é permitida"?

man bashlê:

Special Parameters
       The shell treats several parameters specially.
       These parameters may only be referenced; assignment to them is not allowed.

Bem, shiftmuda ambos @e *(da mesma forma, claro). E set -- one two threena verdade atribui o que eu quiser @e *.

Então, estou interpretando mal o que as manpáginas dizem?

Responder1

Você não pode atribuir parâmetros especiais. Você não pode usar o operador de atribuição ( 1=foo, @=(foo bar), ?=0,…). Você não pode usar a construção de expansão de parâmetro de atribuição ( ${1=foo}, …).

Claro, você pode modificá-los, mas você deve usar um método indireto diferente da atribuição, como o set(com argumentos sem opção) ou shiftembutidos para definir os parâmetros posicionais e $#, set(com opções) para modificar $-, executando um comando para definir $?, etc.

Como exceção, você pode atribuir to _, embora geralmente não funcione ( _=foo a=$_define apara fooe _para a string vazia).

Responder2

O cerne da sua pergunta reside no que é uma tarefa. man bashaparentemente não o define, masA especificação POSIX contém uma palavra:

4.23 Atribuição de Variáveis

Na linguagem de comando shell, uma palavra que consiste nas seguintes partes:

varname=valor

Você pode modificar os parâmetros especiais $@por $*alguns meios internos do shell, mas na verdade não pode escrever uma atribuição para eles. Eles foram escolhidos com sabedoria, eu diria, porque de fato não pareceria muito natural escrever *=string, mesmo para olhos não tão treinados.

informação relacionada