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

18

Eu vejo isso em um script de shell.

variable=${@:2}

O que isso está fazendo?

    
por emaillenin 30.09.2013 / 14:35

2 respostas

26

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

Exemplo

Aqui está um script de exame.

#!/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

por 30.09.2013 / 14:51
13

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.

    
por 30.09.2013 / 15:18