Bash: scripts con argumentos y un poquito más

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 :D . 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!

2 pensamientos en “Bash: scripts con argumentos y un poquito más

  1. Yo no sabía lo de $@ ni lo del switch con paralabras :P

    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 (?)

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>