sábado, diciembre 18, 2004

Scripts en shell

Shell Scripting

Saludos nuevamente a todos aquellos que andan buscando en la red algo nuevo que aprender.

Me toco aprender shell scripting, asi que me puse a averiguar unas cuantas cosillas.

Lo primero:
Este pequeño manual esta basado en mis experiencias y no pretende ser un manual oficial, pero si te sirve pues mejor =)
Lo segundo:
Estos scripts funcionan en Linux (a los fanaticos del click windows no les servira de nada, quedednse con su click no ma y compren software para hacer mas rico a Moco$oft)
Lo tercero:
estos escript fueron desarrollados en BASH ( Bourne Again Shell ) si es que funcionan en otro interprete de comandos pues no tengo idea, asumo que si, pero por todo el usado hoy en dia es el BASH, asi que para gente normal asumo que va a funcionar, para saber si estas usndo el interprete bash escribe...

echo $SHELL

y si como resultado te sale

/bin/bash

entonces esta bueno, si tienes bash.

Bueno comencemos. ;)

Condiciones:
- Se asume que el usuario lector tiene conocimientos basicos de linux en consola
- Se asume que el usuario lector esta empeñado en aprender asi que cuando no pueda hacer algo porque se equivoco en digitar seguira adelante contra todo, y no se cansara hasta terminar este tutorial.

Un script es un conjunto de lineas con una secuencia logica el cual es interpretado por algun programa manager, este lee cada linea y la reconoce como una sentencia a ejecutar, y si esta linea posee la sintaxis normal estipulada por el programa manger entoncecs la ejecuta, caso contrario te envia un error, porsupuesto te dice cual es el error y en que linea se encuentra, asi que no te vais a desesperar cuando algo no te salga, solo LEE el error, buscalo y enmendalo.
Cuando me refiero a interpretado tambien quiero decir que este programa script no es compilado, es decir no se crea en ningun momento un programa binario que se refiera a nuestro script.

Tenemos algunos lenguajes interpretados populares en el planeta como son
  • PHP ---> paginas web
  • JAVASCRIPT ---> paginas web
  • SIRC ---> script para IRC :)
  • y varios otros.
para crear un script necesitamos un editor simple, yo use el "vi" usa el que desees.

toda linea en un script comienza por el interprete de comando, de la siguiente manera

#!/bin/bash

esto especifica el interprete y su ruta absoluta de donde se encuentra el inteprete.
ojo, no equivocarse aqui de lo cotrrario daria un error aun que el escript este bien hecho.

entonces, nuestro primer script

1.- Hola mundo

creamos un archivo con nombre script1.sh, copiamos ( si usamos "vi": vi script1.sh )

#!/bin/bash
echo "HOLA MUNDO";

salimos y grabamos ( si usamos "vi": presionamos la tecla ESC, luego :wq enter )
ahora lo unico que necesitamos es darle permisos de ejecuacion

chmod a+x script1.sh

ahora solo ejecutamos usando

sh script1.sh

o

./script1.sh

cualquiera de la 2 funciona

2 .- variables
Las variables estan presedidas por el signo $ , solo se especifica el dolar cuando la variable ya posee valor ejemplo

#!/bin/bash
valor="Esta es una variable";
echo $valor;

3.- ejecutando comandos
Los comando de consola son capaces de ser ejecutados aqui, ejemplo

#!/bin/bash
clear;
ls -al;
echo "FFFFFFFFFFFFIIIIIIIIIIIIIIIIIINNNNNNNNNNNNNNNNNN";
ifconfig | mail -s "desde mi script" aehmc@hotmail.com

como puedes ver ejecutamos 4 comandos y todos dentro del script.

4.- Operadores y expersiones

+ Suma
- Resta
/ Division
\* Multiplicacion

Posibles expresiones para condicionales
Para ficheros:
-r Es Verdadero si el fichero existe y se puede leer
-w Es Verdadero si el fichero existe y se puede escribir en el
-x Es Verdadero si el fichero existe y es ejecutable
-f Es Verdadero si el fichero existe
-d Es Verdadero si es un directorio
-s Es Verdadero si el fichero existe y tiene un tamaño mayor que cero.
-b fichero - Verdadero si fichero existe y es un block especial.
-c fichero - Verdadero si fichero existe y es un character special.
-e fichero - Verdadero si fichero existe
-g fichero - Verdadero si fichero existe y es un set-group-id.
-k fichero - Verdadero si fichero tiene su ``sticky'' bit set.
-L fichero - Verdadero si fichero existe y es un symbolic link.
-p fichero - Verdadero si fichero existe y es un named pipe.
-S fichero - Verdadero si fichero existe y es un socket.
-t [fd] - Verdadero si fd está abierto en un terminal. Si fd es omitido, su defecto es 1 (standard output).
-u fichero - Verdadero si fichero existe y su set-user-id bit is set.
-O fichero - Verdadero si fichero existe y es un owned by the effective user id.
-G fichero - Verdadero si fichero existe y es un owned by the effective group id. fichero1 -nt fichero2 - Verdadero si fichero1 es
mas nuevo (according to modification date) que fichero2.
fichero1 -ot fichero2 - Verdadero si fichero1 is mas viejo que fichero2. fichero1
-ef fichero2 - Verdadero si fichero1 y fichero2 tienen el mismo numero de device and inode.
-z string - Verdadero si la longitud de string es 0.
-n string - Verdadero si la longitud de string no es 0.
string1 = string2 - Verdadero si los strings son iguales
string1 != string2 - Verdadero si los strings no son iguales.
! expr - Verdadero si expr es falso.
expr1 -a expr2 - Verdadero si expr1 y expr2 son verdaderos.
expr1 -o expr2 - Verdadero si expr1 o expr2 es verdadero.
arg1 OP arg2 - OP es uno de -eq, -ne, -lt, -le, -gt, or -ge.

4.- estructuras de control
las estrtucturas de control son parte importante dentro de la programacion
nota. los comentarios van precedidos del signo #
otra nota. el nombre de los scripts lo pondre en la segunda linea de cada script

IF

#!/bin/bash
#if1.sh
echo "Inserte un valor";
read valor;
if [ -z $valor ] ;then
echo "La cadena es vacia";
else
echo "El valor ingresado es $valor";
fi

en el ejemplo anterior la linea read lee un valor desde la consola y la recibe como parametro
-z quiere nos devuelve un valor true o false dependiendo si $valor posee algun valor ingresaso desde "read" , si es verdadero, imprime "La cadena es vacia", de lo contrario imprime el valor de la variable valor.

un ejemplo mas.

#!/bin/bash
#if2.sh
fichero=$1
if [ -s $fichero ] ; then
echo "El fichero existe y su contenido es";
echo "...................................";
sleep 3;
cat $fichero;
else
echo "El fichero $fichero no existe o tiene tamano 0 o no se puede leer";
fi

para hacer funcionar este ejemplo ejecute ./if2.sh /etc/fstab
fichero=$1 ---> $1 captura el primer parametro de la linea anterior "./if2.sh /etc/fstab", es decir captura "/etc/fstab" entonces la variable fichero constiene "/etc/fstab"
if [ -s $fichero ] ; then ---> -s es verdadedo si el fichero existe y tiene un tamaño mayor que cero
sleep 3; ----> retarda la ejecucion del script en 3 segundos
cat $fichero; ----> imprime en pantalla el archivo /etc/fstab

otro ejemplo

SELECT CASE

#!/bin/bash
echo "ingrese un numero de dia";
read numero;
case $numero in
1) echo "Lunes";;
2) echo "Martes";;
3) echo "Miercoles";;
4) echo "Jueves";;
5) echo "Viernes";;
6) echo "Sabado";;
7) echo "Domingo";;
*)echo "Opcion no valida";;
esac

Sabemos que el case es como tener una serie de if cosecutivos, en este caso

read numero; ----> lee un valor numerico de dia de la semana
case $numero in ----> evalua la variable $numero en los casos
1) echo "Lunes";; ----> si es 1 entoncecs imprimimos Lunes
2) echo "Martes";; -----> si es 2 entoncecs imprimimos Martes
3) echo "Miercoles";; ----> asi sucesivamente ( fijate bien en los 2 ;; ( puntos y coma))
4) echo "Jueves";;
....
*)echo "Opcion no valida";; ---> evalua si el valor ingresado cualquier otro
esac -----> cierra la intruccion

FOR - WHILE

for
sintaxis
for ; do
senetencia1
senetencia2
senetencian
done


#!/bin/bash
#for.sh
echo "Imprimiendo ";
for num in `seq 1 10`; do
echo "Contado:$num";
done

ojo con el simbolo ---> ` <---- que no es --> ' <---apostrofe ni comilla
for num in `seq 1 10`; do --->
num---> sera la variable contador
`seq 1 10` ---> secuencia desde el 1 hastta el 10

mas ejemplos
tambien se puede hacer for tipo C,

#!/bin/bash
#for2.sh
for i in $(ls);do
echo "item:$i";
done

for i in $(ls);do --->
i ----> es la variable contador que contendra cada item resultante del comando "ls"
$(ls) ----> variable limite de iteracion cuya fuente o valor es el resultado del comando "ls"

while





http://www.trhex.com/csharp