Eu vejo isso em um script de shell.
variable=${@:2}
O que isso está fazendo?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Veja a diferença?
Eu vejo isso em um script de shell.
variable=${@:2}
O que isso está fazendo?
var="my_value"; echo var="${var[@]:2}"; echo "$var"
Veja a diferença?
Respostas:
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
.
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
vars=( "${@:2}" )
$@
e ${@}
são idênticos, embora o último seja a sintaxe "mais correta". É necessário usar os colchetes com ${@:2}
, porque $@:2
é ambíguo e, portanto, seria interpretado como ${@}:2
, o que não é a mesma coisa.
Esse é um ksh
recurso também encontrado nas bash
versões recentes do zsh
.
Em ksh
e bash
, você pode acessar vários elementos de uma matriz usando a ${array[@]:first:length}
sintaxe, que se expande para até length
(ou todos, se length
for omitido) elementos da array
matriz (na lista de elementos da matriz classificados numericamente nos índices), começando com o primeiro com índice maior ou igual a first
. Quando no contexto escalar (como aqui em uma atribuição a uma variável escalar), a lista de elementos é unida com 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. Assim ${@:1}
é o mesmo que $@
, não ${@:0}
como para outras matrizes.
Em zsh
, é um pouco diferente. zsh
adicionou a 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
matrizes são um tipo de variável diferente das variáveis escalares, não são esparsas ( zsh
tem matrizes associativas como outro tipo de variável) e iniciam no índice 1 em vez de 0.
Para zsh
, você acessa intervalos de elementos de matriz com $a[first,last]
(onde last
também pode ser negativo para contar de trás para frente no 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]
iria expandir-se para elementos 12-50, e ${a[@]:12:2}
só iria expandir-se para o (vazio) $a[12]
e $a[13]
elementos. Como um caso especial, e novamente para portabilidade com ksh93
e bash
, zsh
também aceita um 0
primeiro elemento $@
e trata isso como $0
.
Portanto, você pode usar ${a[@]:x:n}
e ${@:x:n}
portável em todas as três conchas, mas apenas para matrizes não esparsas, e prestar atenção ao valor do IFS.