Sobre os méritos relativos de '' $ @ '' e '' $ @ [@] ''

6

Sempre que estou escrevendo um script (ou função) que deve "repassar" seus argumentos para algum outro "chamariz" downstream (binário, script, função, etc.) foo , codifico esta passagem de argumentos como este

foo "$@"

... mas também vi esta alternativa

foo "$@[@]"

Eu tentei, sem sucesso (pelo menos com zsh ), inventar cenários nos quais essas duas abordagens produziriam resultados diferentes.

Eles são realmente sinônimos? Se não, quando alguém preferiria uma forma sobre a outra?

(Eu estou interessado principalmente no caso de zsh , que é meu shell diário, mas no trabalho eu geralmente preciso escrever bash scripts, então eu ficaria curioso sobre a resposta a esta pergunta para bash também.)

    
por kjo 16.01.2017 / 16:59

1 resposta

6

"$@" é uma invenção da Bourne shell (1979). Isso significa expandir para a lista de parâmetros posicionais, como se você tivesse digitado "$1" "$2" "$3"... .

Quando David Korn adicionou suporte à matriz no início dos anos 80, estendeu esse conceito para matrizes com a sintaxe "${array[@]}" . zsh também suporta o formato "$array[@]" mais curto.

"$@" refere-se aos parâmetros posicionais (a partir de $1 ), é um pouco como uma matriz, mas exceto em zsh ou yash , não exatamente. Por um lado, $@ começa no índice 1, enquanto outros arrays em ksh ou bash começam em 0. ${@[@]} não funciona em ksh ou bash .

Os únicos shells em que "${@[@]}" funciona são zsh e yash . zsh é o único em que "$@[@]" funciona. Não adianta usá-lo sobre o padrão "$@" . O que poderia ser mais útil é algo como dizer: "$@[1,3]" para obter os 3 primeiros parâmetros posicionais.

Se o ponto é que você gostaria de usar uma sintaxe parecida com uma matriz, em zsh , você pode usar "$argv[@]" ( $argv é uma matriz que se refere aos parâmetros posicionais, como csh / tcsh / fish ).

    
por 16.01.2017 / 18:23

Tags