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
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
"$@"
. Suaargv
atribuição seria interrompida se qualquer argumento contivesse espaços.