jueves, 20 de diciembre de 2012

Desplazamiento de parámetros en bash

Justamente estaba comentando en los comentarios  sobre el desplazamiento de parámetros que también podríamos llamar desplazamiento de argumentos, ya que son los argumentos que tomamos de la linea de comandos o rutinas(explico mas adelante), el hecho es que esta entrada no es un numero de nuestros tutoriales de medium scripting,solo es un tutorial que después implementaremos y como es sencillo lo haré rápidamente :D

Vamos a comenzar, como mencione en el tutorial de acá podemos hacer uso de parámetros/argumentos tomados desde la linea de comandos, por ejemplo:

Este color es mi shell($PS1):

(rivera@super-tux)-( bash mi_script.sh argumento1 argumento2

 Como vemos es sencillo y ya mencione como hacerlo

Tutorial
Ahora el hecho es deplazar los argumentos.

En la shell de bash existe un comando llamado shift que lo que hace es desplazar los parámetros de linea de comandos de derecha a izquierda:

parametro2 ocupa el lugar de parametro1 y 3,4,5 tambien se retroceden

Como?

Vamos a poner un ejemplo sencillo en un script:

Han visto los programas tipo consola que usan parametros (-a,-b,-h,-etc) este es un ejemplo de como se hacen esos programas:


#!/bin/bash

parametros="-t -h -p --help"

function ayuda {

echo " -t [Texto]  <Muestra texto>"
echo " -h          <Muestra Hostname>"
echo " -p [Sitio]  <Hace ping>"
echo " --help      <Muestra ayuda>"

}

function uso {

echo "Uso $0 $parametros";

}

if [ $# == 0 ]; then
    uso; exit 1;
fi

case $1 in
--help)
ayuda; 
;;
-t)
shift; echo $1;
;;
-h)
hostname;
;;
-p)
shift; ping $1 
;;
exit)
exit 1;
;;
clear)
clear;
;;
*)
uso;
;;
esac




Bien, el case/esac y el if/fi están explicados en el basic scripting, aquí lo que hay que mencionar es:


case $1 in
--help)
ayuda; 
;;
-t)
shift; echo $1;
;;.......

Como vemos toma como valor el $1 que es el primer parametro,luego lo compara como normalmente,pero cuando llega al comparador -t es cuando inicia la magia de shift:

Desplaza el parámetro $2 a $1 y el comando que sigue,que en este caso es echo toma el parámetro $1 que es el $2:

Ejecuten este script mal hecho(sin shift)


#!/bin/bash

parametros="-t -h -p --help"

function ayuda {

echo " -t [Texto]  <Muestra texto>"
echo " -h          <Muestra Hostname>"
echo " -p [Sitio]  <Hace ping>"
echo " --help      <Muestra ayuda>"

}

function uso {

echo "Uso $0 $parametros";

}

if [ $# == 0 ]; then
    uso; exit 1;
fi

case $1 in
--help)
ayuda; 
;;
-t)
echo $1;
;;
-h)
hostname;
;;
-p)
shift; ping $1 
;;
exit)
exit 1;
;;
clear)
clear;
;;
*)
uso;
;;
esac

El ejemplo es claro:

La orden que esta en case,ejecuta el mismo parámetro que usa case como valor(no lo cambia)



Pensando un poco,podemos darnos cuenta que en este ejemplo podemos tener el mismo resultado así:


#!/bin/bash

parametros="-t -h -p --help"

function ayuda {

echo " -t [Texto]  <Muestra texto>"
echo " -h          <Muestra Hostname>"
echo " -p [Sitio]  <Hace ping>"
echo " --help      <Muestra ayuda>"

}

function uso {

echo "Uso $0 $parametros";

}

if [ $# == 0 ]; then
    uso; exit 1;
fi

case $1 in
--help)
ayuda; 
;;
-t)
echo $2;
;;
-h)
hostname;
;;
-p)
shift; ping $1 
;;
exit)
exit 1;
;;
clear)
clear;
;;
*)
uso;
;;
esac

Como vemos en este ejemplo no es muy necesario shift pero implementandolo en otra cosa si, aquí un script que muestra el funcionamiento de shift para entenderlo mejor:

Copia y ejecuta:


#!/bin/bash

function dormir {

echo "Aguarde..."; sleep 5;

}

if [ $# == 0 ]; then 
echo -e "No hay parametros :( \nUso: $0 parametro1 parametro 2 etc"
exit 1;
fi

clear

echo -e "Misparametros: $# \nParametro 1: $1\nParametro 2: $2\nParametro 3: $3"

echo "Haciendo shift"; shift;dormir;

echo -e "Misparametros: $# \nParametro 1: $1\nParametro 2: $2\nParametro 3: $3"

No vean el script,vean lo que hace el script

Eso es todo :D


A no, me falta hablar sobre las rutinas:

En una no podemos usar estos parametros ya que toma propios

¿?

Que?

A lo que me refiero es que a una rutina, no podemos pasarle parametros desde linea de comandos,debemos pasarle desde el script

Por ejemplo

#!/bin/bash

#Definimos una rutina:

mi_rutina () {

echo $1
echo $2

}
# La llamamos
mi_rutina

Y ejecutamos así

bash mi_script.sh parametro1 parametro2

Como ven ejecuta echo,pero no imprime nada:



Si queremos pasarle un parámetro es desde el mismo script con esta sintaxis:


#!/bin/bash

#Definimos una rutina:

mi_rutina () {

echo $1
echo $2

}
# La llamamos

mi_rutina parametro1 parametro2



Pero si queremos usar argumentos globales podemos hacer mala practica esto:



#!/bin/bash

#Definimos una rutina:

mi_rutina () {

echo $1
echo $2

}
# La llamamos

parametro1=$1
parametro2=$2

mi_rutina $parametro1 $parametro2

Eso es todo





No hay comentarios.:

Publicar un comentario

Los comentarios serán revisados antes de ser publicados.