Eu vejo isso em um script de shell.
variable=${@:2}
O que isso está fazendo?
bash
shell-script
ksh
Lenin Raj Rajasekaran
fonte
fonte
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ávelvariable
.Exemplo
Aqui está um script de exemplo.
Exemplo de execução:
Referências
fonte
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 nasbash
versões recentes dozsh
.Em
ksh
ebash
, você pode acessar vários elementos de uma matriz usando a${array[@]:first:length}
sintaxe, que se expande para atélength
(ou todos, selength
for omitido) elementos daarray
matriz (na lista de elementos da matriz classificados numericamente nos índices), começando com o primeiro com índice maior ou igual afirst
. 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 combash
eksh93
e com o primeiro caractere de$IFS
(ou nada se$IFS
estiver vazio ou espaço se não estiver definido) comzsh
.Por exemplo:
$@
é 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 aksh
sintaxe apenas recentemente para compatibilidade, mas tem sua própria sintaxe para selecionar intervalos de elementos.Ao contrário de
ksh
ebash
,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]
(ondelast
também pode ser negativo para contar de trás para frente no final).Em
zsh
,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 comksh93
ebash
,zsh
também aceita um0
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.fonte