Esto es bien simple. Los argumentos se basan en variables, sean $1, $2, $3… $n (siendo n un número). $0 está reservada para el nombre del script.
Veamos un ejemplito para que vean como se maneja esto:
#!/bin/bash # # Guárdenlo con el nombre que quieran # y denle permisos de ejecución. # Acá lo guardamos como: # ejemplo1.sh # echo $1
Ejecútenlo. Les pongo la orden y el resultado en la siguiente línea:
./ejemplo.sh argumento
argumento
Como ven, le hemos pasado un parámetro (o argumento) al script y ha hecho lo que se suponía: imprimir en pantalla la primer palabra que se le pase como parámetro. Si a ese script le pasaran dos argumentos (./ejemplo1.sh argumento1 argumento2), solo imprimiría argumento1, ya que no hemos definido otro parámetro. Si queremos que ese script imprima en pantalla dos argumentos, a la línea que dice echo $1, tendríamos que reemplazarla por echo $1 $2.
Supongamos que no queremos que nos limite los argumento en este simple script, para eso usamos la variable$@, la cual es un array que engloba a todos los argumentos:
#!/bin/bash # # ejemplo2.sh # echo $@
Si ejecutamos el código anterior pasandole varios parámetros, nos imprimirá todos:
./ejemplo2 argumento1 argumento2 argumento2 argumenton
argumento1 argumento2 argumento2 argumenton
Ahora algo un poquito más complejo
. Pasemos como parámetro el nombre de algún archivo/directorio y detectemos que tipo de archivo es, en este ejemplo, si es un directorio/carpeta/comoseaquelollames y, en caso de serlo, que imprima cierto mensaje, caso contrario, oootro mensajito. Esta comprobación la hacemos con -d, que comprueba si es un directorio.
#!/bin/bash
#
# ejemplo3.sh
#
# Me imagino que saben leer un if, no?
if [ -d "$1" ]; then
echo "Es un directorio"
else
echo "Es cualquier cosa, menos un directorio =P"
fi #fin del if
Momento de ejecutarlo:
./ejemplo3.sh /home/usuario
Es un directorio
./ejemplo3.sh /home/usuario/lalala.txt
Es cualquier cosa, menos un directorio =P
Pueden ver los tipos de operadores de chequeo en TLDP -> File test operators
Veamos un caso en serio
. Este script lo hice para arrancar, parar y reiniciar los servicios de Apache y MySQL en Slackware (si lo usan tendrán que buscar los scripts correspondientes en su distribución). Hago uso de sudo para ejecutar los scripts de esos servicios, debido a que es necesario hacerlo como root; tres funciones: lamp_start, lamp_stop y lamp_restart; y case para decirle al script que hacer en caso de recibir cierta orden, haciendo uso de un solo parámetro.
#!/bin/bash
#
# lamp.sh
lamp_start() {
echo "Arrancando Apache"
# el sh que pongo antes de cada script es necesario
# en mi caso, ya que están sin permisos de
# ejecución, para evitar que el sistema los ejecute
# al inicio del sistema
sudo sh /etc/rc.d/rc.httpd start
echo "Arrancando MySQL"
sudo sh /etc/rc.d/rc.mysqld start
echo ""
}
lamp_stop() {
echo "Parando Apache"
sudo sh /etc/rc.d/rc.httpd stop
echo "Parando MySQL"
sudo sh /etc/rc.d/rc.mysqld stop
echo ""
}
lamp_restart() {
lamp_stop
lamp_start
}
# Hacemos un case para que el script sepa
# que hacer en caso de recibir cierto argumento
case "$1" in
'start')
# si le paso 'start' como argumento ejecutará la función:
lamp_start
;;
'stop')
# si le paso 'stop' como argumento ejecutará la función:
lamp_stop
;;
'restart')
# si le paso 'restart' como argumento ejecutará la función:
lamp_restart
;;
*)
# si le pasara un parámetro que no existe o ninguno,
# imprimirá en pantalla
echo "Uso: $0 start|stop|restart"
# En lugar de $0 se mostrará la ruta y nombre del script
esac # fin del case
Es una mera introducción a los argumentos en bash, pero les puede llegar a servir. Hasta la próxima!
Yo no sabía lo de $@ ni lo del switch con paralabras
Los únicos scripts servibles que hice fueron: uno para conectar a internet (por temitas X de Mint que no guarda la config =S ) y otro para Habilitar/deshabilitar los efectos (composite) en Xfce ^-^
Voy por buen camino (?)
Vas por buen camino
Yo no soy de hacer scripts, salvo cuando me pueden facilitar alguna tarea tediosa (si no lo es, no hago nada
)