Puede usar la bash
expansión de parámetros para especificar un rango, esto también funciona con parámetros posicionales. Para $3
... $n
sería:
"${@:3}" # expands to "$3" "$4" "$5" …
"${*:3}" # expands to "$3 $4 $5 …"
Tenga en cuenta que ambos $@
e $*
ignore el primer argumento $0
. Si se pregunta cuál usar en su caso: es muy probable que desee una cotización $@
. No lo use a $*
menos que explícitamente no quiera que los argumentos se citen individualmente.
Puedes probarlo de la siguiente manera:
$ bash -c 'echo "${@:3}"' 0 1 2 3 4 5 6
3 4 5 6
$ echo 'echo "${@:3}"' >script_file
$ bash script_file 0 1 2 3 4 5 6
2 3 4 5 6
Tenga en cuenta que en el primer ejemplo $0
se llena con el primer argumento, 0
mientras que cuando se usa en un script $0
se llena con el nombre del script, como muestra el segundo ejemplo. El nombre del script, por bash
supuesto, es el primer argumento, solo que normalmente no se percibe como tal; lo mismo se aplica a un script ejecutable y llamado "directamente". Entonces, en el primer ejemplo tenemos $0
= 0
, $1
= 1
etc. mientras que en el segundo es $0
= script_file
, $1
= 0
, $2
= 1
etc .; ${@:3}
selecciona cada argumento que comienza con $3
.
Algunos ejemplos adicionales para posibles rangos:
# two arguments starting with the third
$ bash -c 'echo "${@:3:2}"' 0 1 2 3 4 5 6
3 4
# every argument starting with the second to last one
# a negative value needs either a preceding space or parentheses
$ bash -c 'echo "${@: -2}"' 0 1 2 3 4 5 6
5 6
# two arguments starting with the fifth to last one
$ bash -c 'echo "${@:(-5):2}"' 0 1 2 3 4 5 6
2 3
Otras lecturas:
shift
enfoque hará que sea imposible acceder$1
y$2
después de que los haya cambiado. En el script que usa$2
junto con$variable_in_question
, debe cambiar eso o usar el enfoque de Expansión de parámetros.shift
es bueno cuando el primero o más argumentos son especiales y que tiene sentido para recogerlos a cabo en variables independientes (foo="$1"; bar="$2";
oif [[ something with $1 ]];then blah blah; shift
. Pero @ respuesta de postre con el método no destructivo es agradable en otros casos cuando se hace todavía desea la lista completa más adelante , o cuando usa una sintaxis más elegante para seleccionar un rango limitado de args, no hasta el infinito, sin introducir args vacíos a un comando si$@
no tiene tantos elementos.En general, puede copiar los parámetros posicionales en una matriz, eliminar los índices arbitrarios de la matriz y luego usar la matriz para expandir exactamente los índices que desee, sin perder sus argumentos originales.
Por ejemplo, si quisiera todos los argumentos excepto el primero, cuarto y quinto:
En la copia, los índices se desplazan por 1, ya
$0
que no forma parte de$@
.fuente
echo "${args[@]:2}"
para el tercer y último argumento.