Bash: fatia de parâmetros posicionais

Como posso obter uma fatia de $@ no Bash sem ter que copiar primeiro todos os parâmetros posicionais para outra matriz como esta?

argv=( "$@" ) echo "${argv[@]:2}"; 

Comentários

  • Sempre cite "$@". Sua argv atribuição seria interrompida se qualquer argumento contivesse espaços.

Resposta

Você pode usar o mesmo formato de qualquer outra matriz. Para extrair o segundo e terceiro elementos de $@, você faria:

echo "${@:1:2}" - - | |----> slice length |------> slice starting index 

Comentários

  • Mas isso parece funcionar caractere por caractere na v4.1.2. Existe uma maneira de fazer isso palavra por palavra?
  • @AlexejMagura I não ' não entendo o que você quer dizer. Isso atua sobre os elementos da matriz. Se você tiver elementos de um caractere, funcionará " em caracteres ". Se cada elemento for uma palavra, funciona com palavras. Talvez você esteja tentando isso em uma string e não em uma matriz?
  • Eu ' estou tentando em uma cópia de " $ @ ", que acho que pode se tornar uma string nesse ponto, ' não tenho certeza.
  • No bash 4.2.46, "${@:1:2}" realmente me fornece o primeiro e segundo argumentos de linha de comando . Enquanto isso, "${@:1}" fornece os argumentos completos da linha de comando e "${@:0}" fornece o nome do script seguido por argumentos de linha de comando completos .
  • @Rockallite bem, sim. O segundo e o terceiro elementos da matriz $@ são o primeiro e o segundo argumentos. "${@:1}" imprimirá toda a matriz começando com o segundo elemento (o primeiro argumento) e ${@:0} a matriz inteira começando com o primeiro elemento que é o nome do script. O que você esperava?

Resposta

Para parâmetros de função, a resposta com echo "${@:1:2}" não funcionou para mim. Além disso, eu queria separar o primeiro elemento, pois era um parâmetro diferente. O que funcionou foi:

function foo(){ #takes single param + array of params local param1="$1". #first param local -a tmp=( "${@}" ) #copy all params local -a rem_params=( "${tmp[@]:1}") #slice off first:Works! # local -a rem_params=( "${@[@]:1}" ) #DID NOT WORK, ERROR # local -a rem_params=( "{@:1}" ) #DID NOT SLICE echo "${rem_params[@]}" } 

Talvez eu escreva para testar para ver como isso funciona com argumentos posicionais no nível do script, mas não há tempo agora.

Resposta

Normalmente faço isso:

somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth 

que imprimirá:

message = first other = second third goforth 

Você pode expandir o conceito shift depois do segundo, terceiro, etc. argumento

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *