Eu vejo isso em um script de shell.
variable=${@:2}
O que isso está fazendo?
Responder1
Está mostrando o conteúdo da variável especial $@
, no Bash. Ele 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
Responder2
Esse é um ksh
recurso também encontrado em bash
versões recentes do zsh
.
Em ksh
e bash
, você pode acessar vários elementos de um array usando a ${array[@]:first:length}
sintaxe, que se expande para até length
(ou todos os if length
são omitidos) elementos do array
array (na lista de elementos do array classificados 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 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. Então ${@:1}
é o mesmo que $@
, não ${@:0}
como para outras matrizes.
Em zsh
, é um pouco diferente. zsh
adicionou a ksh
sintaxe recentemente para compatibilidade, mas possui sua própria sintaxe para selecionar intervalos de elementos.
Ao contrário de ksh
e bash
, zsh
os arrays são um tipo de variável diferente das variáveis escalares, não são esparsos ( zsh
possuem arrays associativos como outro tipo de variável) e começam no índice 1 em vez de 0.
Para zsh
, você acessa 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 um array com 235 elementos, a maioria deles vazios. $a[12,50]
expandiria para os elementos 12 a 50 e ${a[@]:12:2}
expandiria apenas para os elementos (vazio) $a[12]
e $a[13]
. Como um caso especial, e novamente para portabilidade com ksh93
e bash
, zsh
também aceita um 0
primeiro elemento $@
e o trata 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 de IFS.