Bash: segmento de parámetros posicionales

19

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

argv=( "$@" )
echo "${argv[@]:2}";
nr
fuente
1
Indique siempre "$@". Su argvasignación se rompería si algún args contuviera espacios.
jordanm

Respuestas:

31

Puede usar el mismo formato que para cualquier otra matriz. Para extraer los elementos segundo y tercero $@, haría:

echo "${@:1:2}"
          - -
          | |----> slice length
          |------> slice starting index 
terdon
fuente
1
Pero esto parece funcionar char por char en v4.1.2, ¿hay alguna manera de hacerlo palabra por palabra?
Alexej Magura
@AlexejMagura No entiendo lo que quieres decir. Eso actúa sobre los elementos de la matriz. Si tiene elementos de un carácter, funcionará "en caracteres". Si cada elemento es una palabra, funciona en palabras. ¿Quizás intentas esto en una cadena y no en una matriz?
terdon
Lo estoy probando en una copia de "$ @", que creo que podría convertirse en una cadena en ese momento, no estoy seguro.
Alexej Magura
En bash 4.2.46, en "${@:1:2}"realidad me da los argumentos de la primera y segunda línea de comando . Mientras tanto, "${@:1}"me da los argumentos completos de la línea de comandos y "${@:0}"me da el nombre del script seguido de los argumentos completos de la línea de comandos .
Rockallite
@Rockallite bien, sí. Los elementos segundo y tercero de la $@ matriz son los argumentos primero y segundo. "${@:1}"imprimirá la matriz completa a partir del segundo elemento (el primer argumento) y ${@:0}la matriz completa a partir del primer elemento, que es el nombre del script. ¿Que estabas esperando?
terdon