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.