O que isso $ {@: 2} significa no script de shell

Eu vejo isso em um script de shell.

variable=${@:2} 

O que ele está fazendo?

Comentários

  • É exatamente assim que aparece no script? A sintaxe parece uma matriz, mas está faltando algumas partes. Você pode postar algumas linhas em torno desta linha do script?
  • Essa é uma variável que começa na segunda letra. var="my_value"; echo var="${var[@]:2}"; echo "$var" Vê a diferença?

Resposta

É “s mostrando o conteúdo da variável especial $@, no Bash. Ela 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

Comentários

  • Observe que a técnica mostrada mistura os argumentos fornecidos em um único fragmento. Se você precisar mantê-los como argumentos separados, use uma matriz: vars=( "${@:2}" )
  • @glennjackman – obrigado por apontar isso.
  • Também observe o uso das chaves. Você deve sempre usar chaves, mas o Bash permite que você as omita quando o contexto não é ambíguo. Portanto, $@ e ${@} são idênticos, embora o último seja " mais correto " sintaxe. Você deve usar os colchetes com ${@:2}, porque $@:2 é ambíguo e, portanto, seria interpretado como ${@}:2, que não é a mesma coisa.

Resposta

Isso “sa ksh recurso também 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 expande para até length (ou todos se length for omitido) elementos de 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 um atribuição a uma variável escalar) a lista de elementos é unida com espaço ch caracteres com bash e ksh93 e com o primeiro caractere de $IFS (ou nada se $IFS está 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. Portanto, ${@:1} é o mesmo que $@, não ${@:0} como para outros arrays.

Em zsh, é ligeiramente diferente. zsh adicionou o ksh sintaxe apenas recentemente para compatibilidade, mas tem sua própria sintaxe para selecionar intervalos de elementos.

Ao contrário de ksh e bash, zsh arrays são um tipo de variável diferente das variáveis escalares, não são esparsos (zsh tem arrays associativos como outro tipo de variável) e iniciar 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 regressivamente a partir do final).

Em zsh,

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

cria uma matriz com 235 elementos, a maioria deles vazios. $a[12,50] se expandiria para os elementos 12 a 50 e ${a[@]:12:2} se expandiria apenas para $a[12] e . Como um caso especial, e novamente para portabilidade com ksh93 e bash, zsh também aceita um 0 primeiro elemento para $@ e trata isso como $0.

Assim, você pode usar ${a[@]:x:n} e ${@:x:n} portavelmente em todos os 3 shells, mas apenas para arrays não esparsos e preste atenção a o valor do IFS.

Comentários

  • Obrigado por explicar a sintaxe de indexação de matriz

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *