Pasar parámetros Bash script desde la Shell: posicionales...
Es posible pasar a un Bash script los argumentos que necesita para su ejecución a partir de la línea de comandos. Estos argumentos son llamados parámetros y conforman dos categorías: los posicionales y los especiales.
¿Para qué sirven los parámetros posicionales?
Estos son los argumentos pasados al script cuando este es invocado. Son almacenados en las variables reservadas 1,2,3,...,9,10,11,... y pueden ser llamados con las expresiones $1,$2...${10},${11}... Hay que tener en cuenta que el shell Bourne está limitado a los parámetros del 0 al 9.
- Ejemplo:
A continuación, mostramos un pequeño script que muestra ciertos argumentos pasados como parámetros en función de su posición. Si algunos parámetros contienen caracteres especiales o espacios, entonces es necesario ponerlo entre comillas.
#!/bin/bash # muestra_param.sh echo "El 1er parámetro es: $1" echo "El 3er parámetro es: $3" echo "El 10mo parámetro es: ${10}" echo "El 15 parámetro es: ${15}"
Tan solo hay que llamar al script desde el terminal y enviarle un cierto número de parámetros (El símbolo $ lo utilizamos para indicar que estamos introduciendo lo que escribimos en consola):
$ ./muestra_param.sh 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Y devuelve:
El 1er parámetro es: 1 El 3er parámetro es: 3 El 10mo parámetro es: 10 El 15 parámetro es: 15
Otra opción es:
$ ./muestra_param.sh uno 2 tres 4 5 6 7 8 9 diez 11 12 13 14 quince 16 17
Dando como resultado:
El 1er parámetro es: uno El 3er parámetro es: tres El 10mo parámetro es: diez El 15 parámetro es: quince
¿Para qué sirven los parámetros especiales?
Estas también son variables reservadas que permiten (en algunos casos) efectuar operaciones sobre los mismos parámetros. A continuación, mostramos una lista de parámetros especiales:
- $0: Contiene el nombre del script tal como es invocado.
- $*: El conjunto de todos los parámetros en un solo argumento.
- $@: El conjunto de argumentos, un argumento por parámetro.
- $#: El número de parámetros pasados al script.
- $?: El código de retorno del último comando.
- $$: El PID del shell que ejecuta el script.
- $! : El PID del último proceso ejecutado en segundo plano.
- Ejemplo:
Un script que pone en práctica los parámetros especiales:
#!/bin/bash echo "Nombre del script: $0" echo "Cantidad de parámetros pasados: $#" # Presentar todos los parámetros como una única cadena echo "Lista de parámetros (único argumento): $*" # Presentar parámetros individualmente echo "Lista de parámetros (un parámetro por argumento):" for param in "$@"; do echo -e "\tParámetro: $param" done echo "PID del shell actual: $$" # Ejecutar comando en segundo plano sleep 100 & echo "PID del último comando en segundo plano: $!" echo "Código de retorno del último comando: $?" # Generar error intencionado y mostrar el código de retorno echo "Generación de un error intencionado..." echo "ls /etc/password 2>/dev/null" ls /etc/password 2>/dev/null echo "Código de retorno del último comando: $?" exit
Escribimos en consola:
$ ./muestra_param_2.sh 1 2 3 cuatro 5 seis
Lo que da como resultado:
Nombre del script: ./muestra_param_2.sh Cantidad de parámetros pasados: 6 Lista de parámetros (único argumento): 1 2 3 cuatro 5 seis Lista de parámetros (un parámetro por argumento): Parámetro: 1 Parámetro: 2 Parámetro: 3 Parámetro: cuatro Parámetro: 5 Parámetro: seis PID del shell actual: 6165 PID del último comando en segundo plano: 6166 Código de retorno del último comando: 0 Generación de un error intencionado... ls /etc/password 2>/dev/null Código de retorno del último comando: 1
¿Cómo inicializar los parámetros?
- El comando “set”
Es posible pasar directamente parámetros al shell gracias a un comando tan simple como “set”. Inicializará automáticamente los parámetros posicionales "$1,$2,$3" con los valores "param1,param2,param3", borrando de este modo los antiguos valores si existieran. Los parámetros especiales "#,* et @" son automáticamente actualizados:
$ set param1 param2 param3
- El comando “shift”
El comando interno “shift” permite desplazar los parámetros. El valor del 1er parámetro ($1) es reemplazado por el valor del 2do parámetro ($2), el del 2do parámetro ($2) por el del 3er parámetro ($3), etc. Es posible indicar como argumento (shift n) el número de posiciones que hay que desplazar los parámetros.
-
Ejemplo
A continuación veremos el empleo del comando interno “shift”:
#!/bin/bash # desplaza_param.sh echo echo "Número de parámetros: $#" echo "El 1er parámetro es: $1" echo "El 3er parámetro es: $3" echo "El 6to parámetro es: $6" echo "El 10mo parámetro es: ${10}" echo "=============================================" echo "Desplazar una posición con el comando \"shift\"" shift echo "Número de parámetros: $#" echo "El 1er parámetro es: $1" echo "El 3er parámetro es: $3" echo "El 6to parámetro es: $6" echo "El 10mo parámetro es: ${10}" echo "=============================================" echo "Desplazar cuatros posiciones con el comando \"shift 4\"" shift 4 echo "Número de parámetros: $#" echo "El 1er parámetro es: $1" echo "El 3er parámetro es: $3" echo "El 6to parámetro es: $6" echo "El 10mo parámetro es: ${10}"
Y su resultado:
$ ./desplaza_param.sh 1 2 3 4 5 6 7 8 9 10
Número de parámetros: 10 El 1er parámetro es: 1 El 3er parámetro es: 3 El 6to parámetro es: 6 El 10mo parámetro es: 10 ============================================= Desplazar una posición con el comando "shift" Número de parámetros: 9 El 1er parámetro es: 2 El 3er parámetro es: 4 El 6to parámetro es: 7 El 10mo parámetro es: ============================================= Desplazar cuatro posiciones con el comando "shift 4" Número de parámetros: 5 El 1er parámetro es: 6 El 3er parámetro es: 8 El 6to parámetro es: El 10mo parámetro es: