Esse também é um recurso ksh encontrado em bash e versões recentes de zsh .
Em ksh e bash , você pode acessar vários elementos de uma matriz usando a sintaxe ${array[@]:first:length} , que se expande para até length (ou todos, se length for omitido) elementos da array array (na lista de elementos do array ordenados 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 a caracteres de espaço com bash e ksh93 e com o primeiro caractere de $IFS (ou nada se $IFS estiver 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 : , $0 também está incluído. Então ${@:1} é o mesmo que $@ , não ${@:0} como em outras matrizes.
Em zsh , é um pouco diferente. zsh adicionou a sintaxe ksh apenas recentemente para compatibilidade, mas tem sua própria sintaxe para selecionar intervalos de elementos.
Ao contrário de ksh e bash , zsh matrizes são um tipo de variável diferente de variáveis escalares, não são esparsas ( zsh tem matrizes associativas como outro tipo de variável) e começam no índice 1 em vez de 0.
Para zsh , você acessa os intervalos de elementos da matriz com $a[first,last] (onde last também pode ser negativo para contar para trás 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 vazia. $a[12,50] seria expandido para os elementos 12 a 50 e ${a[@]:12:2} seria expandido apenas para os elementos (vazios) $a[12] e $a[13] . Como um caso especial, e novamente para portabilidade com ksh93 e bash , zsh também aceita um elemento 0 first para $@ e trata isso 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 do IFS.