Bash: porción de parámetros posicionales

¿Cómo puedo obtener una porción de $@ en Bash sin tener que copiar primero ¿Todos los parámetros posicionales a otra matriz como esta?

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

Comentarios

  • Siempre cite "$@". Tu argv asignación se interrumpiría si algún argumento contuviera espacios.

Responder

Puede usar el mismo formato que para cualquier otra matriz. Para extraer el segundo y tercer elemento de $@, haría lo siguiente:

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

Comentarios

  • Pero esto parece funcionar char por char en v4.1.2, ¿hay alguna manera de hacerlo palabra por palabra?
  • @AlexejMagura I No ' entienda lo que quiere decir. Eso actúa sobre los elementos de la matriz. Si tiene elementos de un carácter, funcionará " en los caracteres ". Si cada elemento es una palabra, funciona con palabras. ¿Quizás estás probando esto en una cadena y no en una matriz?
  • Yo ' lo estoy probando en una copia de " $ @ ", que supongo que podría convertirse en una cadena en ese punto, ' no estoy seguro.
  • En bash 4.2.46, "${@:1:2}" en realidad me da los 1. ° y 2. ° argumentos de la línea de comandos . Mientras tanto, "${@:1}" me da los argumentos completos de la línea de comandos , y "${@:0}" me da el nombre del script. seguido de argumentos completos de la línea de comandos .
  • @Rockallite bueno, sí. Los elementos segundo y tercero de la matriz $@ son los argumentos primero y segundo. "${@:1}" imprimirá la matriz completa comenzando con el segundo elemento (el primer argumento) y ${@:0} la matriz completa comenzando desde el primer elemento que es el nombre del guión. ¿Qué esperabas?

Respuesta

Para los parámetros de función, la respuesta con echo "${@:1:2}" no funcionó para mí en absoluto. Además, quería cortar el primer elemento, ya que era un parámetro diferente. Lo que sí funcionó fue:

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[@]}" } 

Tal vez escriba para probar para ver cómo funciona esto con argumentos posicionales a nivel de script, pero no hay tiempo ahora.

Respuesta

Normalmente hago esto:

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

que imprimirá:

message = first other = second third goforth 

Puede expandir el concepto shift después del segundo, tercer, etc. argumento

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *