Eu vejo isso em um script de shell.
variable=${@:2}
O que ele está fazendo?
Comentários
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
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Vê a diferença?