O que isso ${@:2} significa em scripts de shell

O que isso ${@:2} significa em scripts de shell

Eu vejo isso em um script de shell.

variable=${@:2}

O que isso está fazendo?

Responder1

Está mostrando o conteúdo da variável especial $@, no Bash. Ele contém todos os argumentos da linha de comando, e este comando pega todos os argumentos do segundo em diante e os armazena em uma variável variable,.

Exemplo

Aqui está um script de exemplo.

#!/bin/bash

echo ${@:2}

variable=${@:3}
echo $variable

Exemplo de execução:

./ex.bash 1 2 3 4 5
2 3 4 5
3 4 5

Referências

Responder2

Esse é um kshrecurso também encontrado em bashversões recentes do zsh.

Em kshe bash, você pode acessar vários elementos de um array usando a ${array[@]:first:length}sintaxe, que se expande para até length(ou todos os if lengthsão omitidos) elementos do arrayarray (na lista de elementos do array classificados numericamente nos índices), começando com o primeiro com índice maior ou igual a first. Quando em contexto escalar (como aqui em uma atribuição a uma variável escalar), a lista de elementos é unida com caracteres de espaço com bashe ksh93e com o primeiro caractere de $IFS(ou nada se $IFSestiver vazio ou espaço se não estiver definido) com zsh.

Por exemplo:

$ a[23]=a a[5]=b a[235]=c a[45]=d
$ x=${a[@]:12:2}; printf '<%s>\n' "$x"
<a d>

$@é um caso especial. $@é a matriz de parâmetros posicionais ( $1, $2...). Mas quando usado com :, $0também está incluído. Então ${@:1}é o mesmo que $@, não ${@:0}como para outras matrizes.

Em zsh, é um pouco diferente. zshadicionou a kshsintaxe recentemente para compatibilidade, mas possui sua própria sintaxe para selecionar intervalos de elementos.

Ao contrário de kshe bash, zshos arrays são um tipo de variável diferente das variáveis ​​escalares, não são esparsos ( zshpossuem arrays associativos como outro tipo de variável) e começam no índice 1 em vez de 0.

Para zsh, você acessa intervalos de elementos da matriz com $a[first,last](onde lasttambém pode ser negativo para contar regressivamente a partir do final).

Em zsh,

a[23]=a a[5]=b a[235]=c a[45]=d

cria um array com 235 elementos, a maioria deles vazios. $a[12,50]expandiria para os elementos 12 a 50 e ${a[@]:12:2}expandiria apenas para os elementos (vazio) $a[12]e $a[13]. Como um caso especial, e novamente para portabilidade com ksh93e bash, zshtambém aceita um 0primeiro elemento $@e o trata como $0.

Portanto, você pode usar ${a[@]:x:n}e ${@:x:n}portável em todos os três shells, mas apenas para matrizes não esparsas, e prestar atenção ao valor de IFS.

informação relacionada