Não espero que seja modificável. Ou seja, não espero que ele ative algo como ARGS=("${ARGS[@]}")
, mas apenas simplifique algo como myarray=("${ARGS[@]/--unneeded-argument/}")
.
Observe que o --unneeded-argument
exemplo não pretende implicar a remoção de argumentos é a razão pela qual estou perguntando. É uma pergunta que tenho em mente há anos e nunca obtive uma resposta definitiva.
Não há "matriz regular" correspondente a
$@
.Porém você pode usar
@
em muitos cenários envolvendo arrays (mas não${@[@]}
como você pediu em um comentário —$@
já é uma@
expansão):Na última etapa, no entanto, o resultado pode não ser exatamente o que você procura — a matriz ainda tem três elementos, um dos quais está vazio, pois a substituição é aplicada a todos os elementos da matriz individualmente.
"$@"
faz o mesmo com os parâmetros posicionais que"${foo[@]}"
faz com uma variável de matrizfoo
. Como Stephen disse, você pode usar@
em expansões que usam chaves, por exemplo, a notação de fatia"${@:1:2}"
seria a mesma que"$1" "$2"
. (Deixando o segundo número de fora expande para o resto da lista, por exemplo,"${@:2}"
expande para"$2"
e todos os parâmetros posicionais depois disso.)Isso está de acordo com as variáveis nomeadas, aqui, o "nome" do parâmetro especial é
@
, e o$
na frente apenas aciona a expansão. Observe que as chaves são opcionais para uma expansão simples (sem indexação ou manipulação de string dentro). Então"${@}"
é o mesmo que"$@"
, e você pode até escrever"${@:1}"
com o mesmo efeito, já que a indexação em@
começa em um, não em zero.Mas você não pode usar
${@[@]}
, ou${@[1]}
. Eles são apenas$@
e$1
, respectivamente. (De certa forma,$@
já é como${args[@]}
, então você não pode indexá-lo ainda mais.) Isso também significa que, se você deseja indexar nos parâmetros posicionais, precisará usar a expansão de fatia, por exemplo,${@:i:1}
para obter o elemento na posição eu .No entanto, observe que as expansões de manipulação de strings em matrizes ou
@
se aplicam a todos os elementos individualmente. Por exemplo, aqui,oo
é removido defoo
e deoo
, mas ainda há o terceiro elemento da@
esquerda, está apenas vazio:Se você quiser realmente remover o elemento, terá que fazer outra coisa, como fazer um loop sobre os valores e soltar o que não deseja. Isso provavelmente é mais fácil com a ajuda de um array nomeado em vez de tentar fazê-lo apenas dentro do
$@
. Diga, algo assim:Ou qualquer uma das respostas (muito melhores) para essas perguntas: Como remover um parâmetro posicional de $@