man bash
lê:
Special Parameters The shell treats several parameters specially. These parameters may only be referenced; assignment to them is not allowed.
Bem, shift
muda ambos @
e *
(da mesma forma, claro). E set -- one two three
na verdade atribui o que eu quiser @
e *
.
Então, estou interpretando mal o que as man
pá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 shift
embutidos 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 a
para foo
e _
para a string vazia).
Responder2
O cerne da sua pergunta reside no que é uma tarefa. man bash
aparentemente 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.