jueves, 4 de noviembre de 2010

Shell Script

Ok ahora veamos como hacer un ciclo o bucle en shell, al igual que en programación tenemos la sentencia WHILE , veamos acerca de ella.

el while tiene una condicionante que funciona parecido al if, en ella podemos utilizar evaluaciones echas con el test, veamos la sintaxis

while [ condición ]
do
comandos
done

el comando se repetirá hasta que la condición sea verdadera .

veamos un ejemplo sencillo

echo " indtroduzca numero"
read x
while test $x != 20
do
echo " introduzca el numero correcto"
echo " intente de nuevo"
read x

done

esto lo hará hasta que sea el numero que se ingrese sea 20

también podemos redirecciona información

veamos un pequeño ejemplo

ls -la | while read w x y z
do
echo $w , $x , $y , $z.
done


las letras se convertirán en cada columna y se cortaran en cada espacio vació.


ls | while read x
do
if [ -d "$x" ]
then
echo $x es directorio
break
elif [ -e $x ]
then
echo $x es archivo
continue
fi

done

este script identifica si la listado es archivo o directorio . si es directorio rompe el ciclo


como evaluar expresiones matemáticas en el shell utilizamos expr

veamos un ejemplo

# expr 2 \* 3

este comando puede ejecutar múltiples operaciones matemáticas , es recomendable que vean el manual completo

ahora veremos la sentencia for .

la sentencia for sirve para hace ciclos al igual que el while . veamos como es la sintaxis

# for x in argumentos do comandos done

veamos un ejemplo pequeño, re nombremos todos los archivos de un directorio .

# for x in *.conf; do y=${x/.conf/.old}; mv $x $y; done

veamos otro ejempo de como hacer un contador con el for

# for ((i=0;$i<100;i= `expr $i + 2`)) do echo $i; done;


como notaron , utilice un tipo de comillas para denotar la expresión, esto permite utilizar comandos en las lineas de ejecución . veamos otro ejemplo

miércoles, 3 de noviembre de 2010

Shell Script

Muchas ocasiones nos toca hacer un pequeño script en pantalla para ejecutar alguna operación que puede ser automatizada , el editor "vi"

No voy a entrar mucho a detalle en esto pero daré algunas tips que pueden ayudarnos

1. en el editor vi , en ocasiones es necesario realizar búsquedas se hacen con la /
2. Para ejecutar algún comando de sistema operativo son salir se realiza con !
3. para ejecutar el mismo comando sin repetir la instrucción !!
4. Para hacer referencia al nombre del script utilizamos %
5. si queremos correr el script sin salirmos hacemos lo siguiente !%
6. Para grabar utilizamo la w
7. para grabar y salir usarmos x
8. para moverte al principio del archivo es con 1G
9. Para moverte al final del archivo es G
10. Para moverte al principio de la linea es 0
11. Para moverte al final de la linea es $
12. Para hacer un UNDO es con la letra u
13. Para remplazar caracteres utilizamos la r o R
14. Con dd, borras toda la linea , con D borras el resto de la linea a partir del cursor.

Con esos basicos pasos podemos hacer uso eficiente te nuestro editor.

Uso de variables, el sistema tiene variables de ambiente que no debemos cambiar , pero podemos, estas las podemos consultar

# env

para asignar un valor a una variable lo hacemos de la sig manera

# hola="hola Mundo"
# echo $hola

estas variables solo se pueden usar en el script que se realiza , para que puedan ser utilizadas por diferentes aplicaciones tendremos que exportarlas

# export hola

Podemos agrupar la ejecucion de comandos utilizando paréntesis

# (
> ls
> df
> who
> )



Control de ejecución de comandos , para esto utilizaremos

# ls; df; who;

esto ejecutara un comando despues de otro .

una ejecución de comandos la podemos dividir con \

# ls ; \
> df; \
> who

existe también el re direccionamiento de resultados .

# ls &

manda el comando a back ground

Para redireccionar el resultado de un comando utilizamo |

# ps axu | grep sendmail

este comando redirecciona el resultado del ps al grep para ser filtrados

# ps axu > resultado

redirecciona el resultado del ps a un archivo llamado resultado

# ps axu >> resultado

redirecciona el resultado y lo concatena con el resultado ya existente en el archivo

# ps axu >/dev/null 2>&1

redirecciona el resultado a la nada (el resultado y el error ) &1 significa que utilizara el mismo archivo .


el argumento 2> redirecciona los errores así que podemos dividirlo

# ps aux > resultado 2> errores



tenemos también las condicionantes para ejecución de comandos que utilizaremos && y ||

tenemos el siguiente ejemplo

# mv file.txt file2.txt && echo " Si se armo"

el resultado es , si el comando fue ejecutado correctamente y con status 0 , enviara el mensaje "Si se armo" en caso contrario enviara el error y no correrá el segundo comando

# mv file.txt file2.txt || echo " ya lo habias echo "

este enviara el mensaje si al ejecutar el primer comando se ejecuta correctamente pero su estatus es diferente de 0 o con error .

haa pero surge la pregunta como saber si es un 0 o 1 , cuando se ejecuta un comando el sistema guarda en la variable $? el estatus de la ejecución del comando anterior

ejemplo

# ls a
# echo $?


Sentencia condicional if

la estructura es

if comando
then
comando
comando
comando
elif comando
then
comando
else
comando

fi


un ejemplo sencillo de esto

if ls usuarios.txt > /dev/null 2>&1
then
echo " Ya existe el archivo"
elif who > usuario.txt
echo "Archivo creado
else
echo "No se pudo crear"
if


para auxiliarnos en la evaluación de expresiones utilizaremos el comando test

el comando test regresa un 1 si la evaluación es verdadera y un 0 si es falsa , este cuenta con operadores para hacer multiples evaluaciones veamos alguna de ellas

1. exp1 -a exp2 # ambas epreciones verdaderas
2. !exp # negar la expresion
3. exp1 -o exp2 # es las expresion o logica
4. -n string # si la cadena es diferente de 0
5. -z string # si la cadena es 0
6. cadena1 = cadena2 # compara 2 cadenas iguales
7. cadena1 != cadena2 # compara 2 cadenas diferentes
8. val1 -eq val2 # valores iguales
9. val1 -ge val2 # mayor o igual que
10 val1 -gt val2 # el valor es mayor que
11 val1 -le val2 # menor o igual a
12. val1 -lt val2 # menor que
13. val1 -ne val2 # no son iguales
14. archivo -ef archivo1 #
15. archivo -nt archivo1 # arvhivo es mas nuevo que
16. archivo -ot archivo1 # archivo es mas viejo que
17. -e archivo # el archivo existe
18. -d archivo # existe y es directorio
19. -f archivo # existe y es un archivo regular
20 -xwr archivo # cada una de las letras por separado indica que existe y es ejecutable , escribible, o lecura


Sentencia case para evaluar multiples

case $valor in

valor) comando ;;
valor1) comando ;;
*) valor_default ;;
esac

se utiliza como if anidados ..