Bash: fatia de parâmetros posicionais

19

Como posso obter uma fatia do $@Bash sem precisar primeiro copiar todos os parâmetros posicionais para outra matriz como essa?

argv=( "$@" )
echo "${argv[@]:2}";
nr
fonte
1
Sempre cite "$@". Sua argvatribuição seria interrompida se algum argumento contivesse espaços.
jordanm

Respostas:

31

Você pode usar o mesmo formato de qualquer outra matriz. Para extrair os 2º e 3º elementos de $@, você faria:

echo "${@:1:2}"
          - -
          | |----> slice length
          |------> slice starting index 
terdon
fonte
1
Mas isso parece funcionar com base em caractere por caractere na v4.1.2. Existe uma maneira de fazê-lo palavra por palavra?
Alexej Magura
@AlexejMagura Não entendo o que você quer dizer. Isso atua sobre os elementos da matriz. Se você tiver elementos de um caractere, ele funcionará "em caracteres". Se cada elemento é uma palavra, funciona em palavras. Você está tentando isso em uma string e não em uma matriz?
terdon
Estou tentando em uma cópia de "$ @", que acho que pode se tornar uma sequência nesse momento, não tenho certeza.
Alexej Magura 5/10
No bash 4.2.46, "${@:1:2}"na verdade , me fornece os argumentos da primeira e da segunda linha de comando . Enquanto isso, "${@:1}"fornece os argumentos completos da linha de comando e "${@:0}"o nome do script, seguido pelos argumentos completos da linha de comando .
Rockallite
@ Rockallite bem, sim. Os segundo e terceiro elementos da $@ matriz são o primeiro e o segundo argumentos. "${@:1}"imprimirá toda a matriz começando com o 2º elemento (o 1º argumento) e ${@:0}toda a matriz começando com o 1º elemento, que é o nome do script. O que você estava esperando?
terdon