¿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
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
"$@"
. Tuargv
asignación se interrumpiría si algún argumento contuviera espacios.