Mostrando entradas con la etiqueta terminal. Mostrar todas las entradas
Mostrando entradas con la etiqueta terminal. Mostrar todas las entradas

24 sept 2013

Shell Script; Las expresiones aritméticas y condicionales


Una expresión es una combinación de valores y operaciones que, al ser evaluados, entregan un valor.

El interprete bash soporta una gran variedad de expresiones en el desarrollo de programas, aquí veremos dichas expresiones.

1) Expresiones aritméticas:

A la hora de escribir un programa siempre se precisa de operaciones matemáticas básicas o complejas.

Aquí tenemos una lista de operaciones aritméticas:

Var++: Post-incremento de variable.
Var--: Post-decremento de la variable.
++Var: Pre-incremento de variable.
--Var: Pre-decremento de la variable.
+Expr: Más, numero positivo
-Expr: Menos, numero negativo
! Expr: Negación lógica
~ Expr: Negación binaria.
E1 ** E2 Exponente. E1 elevado a la E2.
E1 * E2: Multiplicación
E1 / E2: División.
E1 % E2: Resto.
E1 + E2: Suma
E1 E2: Resta.
Expr << N: Desplazamiento binario a la izquierda un numero (N) de veces.
Expr >> N: Desplazamiento binario a la derecha un numero (N) de veces.
E1 < E2: Menor que
E1 > E2: Mayor que
E1 <= E2: Menor o igual que
E1 >= E2: Mayor o igual que
E1 = E2: Igualdad.
E1 != E2: Desigualdad.
E1 & E2: Operación binaria Y
E1 ^ E2: Operación binaria O exclusiva
E1 | E2: Operación binaria O
E1 && E2: Operación lógica Y
E1 || E2: Operación Binaria O
E1 ? E2 : E3 Evaluación Lógica Si E1=cierto, devuelve E2; si no, E3
E1 Op= E2: Asignación normal con pre-operación.(*=, /=, %=, +=, -=, <<=, >>=, &=, ^ =, !=) Funciona como E1 = E1 Op E2
E1, E2: Operaciones independientes. Se ejecutan en orden.

Veamos ahora como podemos utilizar algunos operadores aritméticos para realizar algunas operaciones matemáticas básicas: suma resta multiplicación división y módulos.

Comando expr.

expr 10 + 2
#Resultado 12

expr 10 - 2
#Resultado 8

expr 10 * 2
#Resultado 20

expr 10 / 2
#Resultado 5

expr 10 % 2
#Resultado 0


También podemos hacerlo utilizando el comando echo de la siguiente manera:

echo $((10+2))
#Resultado 12

echo $((10-2))
#Resultado 8

echo $((10*2))
#Resultado 20

echo $((10/2))
#Resultado 5

echo $((10%2))
#Resultado 0


Nota: Los comandos expr y echo solo admiten y devuelven enteros, Es importante utilizar espacios para las operaciones con expr, notese la diferencia en el siguiente ejemplo


expr 2+2 #todo pegado
#devuelve 2+2

expr 2 + 2 #con espacios
#devuelve 4


Al utilizar el asterisco * para una operación de multiplicación con el comando expr es importante hacerlo con una barra invertida, si no, nos da error. Ejemplo


expr 2 * 5
#devuelve error

expr 2 * 5 #la barra invertida va antes del * pero aquí no se visualiza
#devuelve 10


otra manera de realizar estas operaciones es con bc que es una potente calculadora que viene instalada en muchas distribuciones GNU/Linux. Par usar bc tenemos dos formas:

bc

abre la calculadora.

Colocas la operación que necesitas realizar

5*5

Al pulsar enter te devolverá el resultado en este caso:

25

quit


con quit salimos.

La otra manera es la siguiente:

echo "5*5" | bc -l
#Resultado 25


En este contexto la segunda manera de usar bc nos podría resultar útil pues como ya sabemos es posible guardar salidas de comandos en variables por ejemplo

$var=$(echo  "6*8" | bc -l)
echo $var
#Resultado 48


Veamos ahora un par de ejemplos.

#! /bin/bash 

clear 
echo "Operaciones Matemáticas" 
read -p "Ingresa el primer valor " val1 
read -p "ingresa el operador bien sea + - / o * " opr 
read -p "Ingresa el segundo valor " val2 
echo "Estamos procesando" 
sleep 2 
res=$(echo "$val1$opr$val2" | bc -l) 

echo $res


Explicación:

Como asumo que ya se han leído los dos tutoriales anteriores solo diré, de las lineas 4, 5 y 6 que pedimos los valores que usaremos y los guardamos en variables, el comando sleep sirve para detener un poco la ejecución del script para dar la sensación de que nuestro “Complejisimo programa calculadora esta leyendo miles de lineas de código para dar un resultado” XD por ultimo guardamos en una variable $res el comando para realizar la operación con bc e imprimimos la variable $res

Una manera mas sencilla pero mas eficaz pues nos permitirá realizar operaciones mas complejas seria:

#! /bin/bash 

clear 
echo "Operaciones Matemáticas" 
read -p "Ingresa tu operación " opr 
echo "Estamos procesando" 
sleep 2 
echo "$opr" | bc -l


con este código podríamos ingresar directamente operaciones como (2*2)*(5*5)-99 y arrojaría 1 como resultado.

2) Expresiones Condicionales

Las expresiones condicionales son evaluadas por los mandatos internos del tipo test, dando como resultado un valor de cierto o de falso. Suelen emplearse en operaciones condicionales y bucles, aunque también pueden ser empleadas en órdenes compuestas.

Podemos dividir las expresiones condicionales en varios tipos según el tipo de parámetros o su modo de operación:

Expresiones con ficheros: que comprueba la existencia, el tipo, los permisos o la facha de archivos o directorios.

Expresiones comparativas numéricas
que evalúan la relación de orden numérico entre los parámetros.

Expresiones comparativas de cadenas
que establecen la relación de orden alfabético entre los parámetros.

a) Expresiones de ficheros.

Son expresiones condicionales que devuelven el valor de cierto si se cumple la condición especificada; en caso contrario da un valor de falso. Hay una gran variedad de expresiones relacionadas con fichero

lista de expresiones

-e Fich: El fichero existe
-s Fich: El fichero esta vacío
-f Fich: Es un Fichero Normal
-d Fich: Es un directorio
-b Fich: Es un dispositivo de bloques
-c Fich: Es un dispositivo de caracteres
-p Fich: Es una tubería
-h Fich:
-L Fich: Es un enlace simbólico
-S Fich: Es un socket de comunicaciones.
-t Fich: El descriptor esta asociado a una terminal
Fich1 -ef Fich2: Los dos ficheros son enlaces hacia el mismo archivo

La siguiente lista de condiciones de permiso comprueban si el usuario que realiza la comprobación puede ejecutar la operación deseada sobre determinado fichero.

-r Fich: Permiso de lectura
-w Fich: Permiso de escritura
-x Fich: Permiso de ejecución
-u Fich: Permiso SUID
-g Fich: Permiso SGID
-t Fich: Permiso de directorio compartido o fichero en cache
-O Fich: es el propietario del archivo
-G Fich: El usuario pertenece al grupo con el GID del fichero

Ahora los operadores relacionados a las fechas

-N Fich: El fichero ha sido modificado desde la ultima lectura
Fich1 -nt Fich2: El Fich1 es mas nuevo que el Fich2
Fich1 -ot Fich2: El Fich1 es mas antiguo que el Fich2

b) Expresiones comparativas numéricas:

Aunque ya vimos los operadores de comparación numérica con las expresiones aritméticas a continuación daremos una lista de operadores ara este formato.

N1 -eq N2: Igual
N1 -ne N2: Diferente
N1 -lt N2: Menor que
N1 -gt N2: Mayor que

c) Expresiones comparativas de cadenas:

A continuación los formatos

Cad1 = Cad2: Igual
Cad1 != Cad2: Diferente
[-n] Cad: La cadena no esta vacía, su longitud no es 0
-z Cad: La longitud de la cadena es 0

El uso de estos los operadores condicionales los veremos más adelante en esta serie de tutoriales por ahora los dejamos en teoría teniendo en cuenta que es importante conocer detalles de este tipo pues aveces sucede que saltamos de variables a funciones y cuando venimos a ver no sabemos ni como hacer una suma y toca regresar.

Espero que les sea útil

Shell Script; Las Variables


 Introducción

Como vimos en la entrada anterior de, Shell Script Básico, un Script es un archivo que contiene una serie de comandos que son ejecutados secuencialmente por un interprete.

Aprendimos como crearlos, editarlos y ejecutarlos, además de que en un shell script podemos incluir los comandos básicos de Linux.

En esta ocasión continuaremos con algunos puntos más avanzados en la programación de scripts.

Las Variables.

Para los que no conocen de programación, veamos que es una variable: Las variables son espacios reservados en la memoria que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa. De la siguiente manera le damos un valor a una variable:

nombre_variable=valor]

Sencillo no? También podemos guardar salidas de programas:

nombre_variable=`comando`
o
nombre_variable=$(comando)

Ejemplo:

variable=$(ls)

Al llamar la variable nos dará una lista de archivos y directorios de la ruta en l que nos encontramos.

También podemos asignarles valor a las variables con el comando (read).

read [ opciones] nombre_variable2 nombre_variableN

Ejemplo:

read -p "Introduce el Nombre y la edad" nombre edad

Las opciones mas usadas son:

-n num_car : Numero máximo de caracteres que se pueden introducir
-p "frase" : Muestra en la pantalla una frase
-d "delimitador" : Especifica un delimitador. Por ejemplo: si el delimitador es un ";" todo lo que este antes del signo lo tomara una variable y lo que este después en la siguiente variable.

Para utilizar los valores de una variable en el código lo hacemos así:

$nombre_variable

y para mostrarla:

echo $nombre_variable

Vamos a ver unos ejemplos sencillos que de una vez nos ayuden a repasar el post anterior.


#! /bin/bash
mkdir ~/Escritorio/Ejemlpo/
> ~/Escritorio/Ejemplo/ejemplo.txt
clear
read -p "Por favor Ingresa tu nombre y tu apellido " nombre apellido
saludo="Hola"
echo $saludo $nombre $apellido > ~/Escritorio/Ejemplo/ejemplo.txt
gedit ~/Escritorio/Ejemplo/ejemplo.txt &


Explicación:

1) Creamos un directorio llamado Ejemplo en el escritorio

2) Creamos un archivo ejemplo.txt dentro del directorio que recién creamos

3) Con el comando clear, Limpiamos la pantalla del terminal

4) le pedimos al usuario que ingrese su nombre y su apellido los cuales serán guardados en las variables nombre y apellido respectivamente

5) Guardamos la cadena "Hola" en la variable saludo

6) Imprimimos las variables $salud $nombre y $apellido en el archivo que creamos en el directorio Ejemplo

7) Por ultimo abrimos el archivo ejemplo.txt con gedit

A continuación un script que se me ocurrió el cual podría resultar útil para los diseñadores web para crear estructuras básicas para paginas web de ejemplos o cosas por el estilo con solo ejecutar un script


#! /bin/bash
clear
read -p "Por favor Ingresa el nombre del directorio raíz de tu pagina " dir
read -p "Por favor Ingresa el titulo tu pagina " titulo
read -p "Por favor Ingresa el nombre de tu pagina " nombreapp
read -p "Por favor Ingresa los tags de tu pagina " tags
read -p "Por favor Ingresa la descripción de tu pagina " descripcion
read -p "Por favor Ingresa el nombre el autor de tu pagina " autor
mkdir /var/www/$dir/;mkdir /var/www/$dir/js;mkdir /var/www/$dir/css;
mkdir /var/www/$dir/img
> /var/www/$dir/index.html; > /var/www/$dir/css/style.css
(
    echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'
    echo '<html xmlns="http://www.w3.org/1999/xhtml" lang="es">'
    echo '    <head>'
    echo "        <title>$titulo</title>"
    echo '        <meta name="application-name" content="'$nombreapp'" />'
    echo '        <meta name="keywords" content="'$tags'" />'
    echo '        <meta name="description" content="'$descripcion'" />'
    echo '        <meta name="author" content="'$autor'" />'
    echo '        <meta http-equiv="content-type" content="text/html; charset=utf-8" />'
    echo '        <link href="css/style.css" rel="stylesheet" type="text/css" media="screen" />'
    echo '        <script type="text/javascript">'
    echo '        </script>'
    echo '    </head>'
    echo '    <body>'
    echo '    </body>'
    echo '</html>'
) > /var/www/$dir/index.html
firefox /var/www/$dir/index.html &
gedit /var/www/$dir/index.html &


Explicación:

1) Limpiamos la pantalla del terminal

2) Le pedimos al usuario ciertos datos necesarios y los guardamos en variables:

dir: Nombre del directorio raíz de la pagina
titulo: Titulo de la pagina
nombreapp, tags, descripcion y autor: para los meta datos application-name, keywords, description y author

3
) Creamos el directorio raíz como vemos en el código el nombre del directorio es el valor de la variable $dir. Dentro de este directorio crearemos los directorios css, js e img

4) Creamos los archivos index.html y style.css dentro del directorio raíz y el directorio css respectivamente

5) Definimos lo que sera el contenido del documento, como podemos ver en el código todos los echo están encerrados en paréntesis y se les dice que se harán dentro del archivo index.html. Con esto logramos que se escriba dentro del archivo en el orden en que aparecen en el script.

6) por ultimo abrimos la pagina en el navegador, en mi caso firefox y en el editor de texto gedit listo para ser editado.

Como siempre espero que les sea de gran utilidad.

Shell Script Básico




Antes de Adentrarnos en el mundo de los scripts es necesario conocer ciertos conceptos básicos que nos ayudaran a entender de una mejor forma que es lo que estamos haciendo.

Que es un Script?

Un script es un tipo de programación interpretada que debido a su facilidad y funcionalidad, se imponen cada día más en el mundo de la informática. Los scripts son generalmente desarrollados en con lenguajes de relativa facilidad pero eso no quiere decir que sean menos funcionales que programas creados con lenguajes de alto nivel.

Trabajando con Linux

El sistema operativo Linux esconde tras de si una larga lista de utilidades que se ejecutan a través de comandos bastante complicados y con muchos parámetros y argumentos. Lo que hace el script es recoger todos esos comando y presentarlos al usuario de una forma sencilla y de rápido acceso.

Que es Shell?

El shell es un programa que sirve como puente de comunicación entre el usuario y el sistema operativo, es equivalente al MSDOS pero mucho más potente.

El shell sirve como interprete de comandos recibiendo los mismos y encargándose de su ejecución; bien sean comandos internos del sistema operativo o escrito por los usuarios en forma de scripts. En el primero de los casos es el mismo shell quien se encarga de la ejecución y en el segundo el shell da paso al kernell y es este quien ejecuta y procesa las ordenes.

El shell también sirve como interprete de programación presentando las mismas características de un lenguaje de programación de alto nivel.

Que necesitamos para comenzar.

Para hacerlo de manera ordenada Vamos a crear una carpeta para guardar nuestros scripts y en ella crearemos nuestro primer script. Abrimos la terminal y ponemos lo siguiente:

Creamos la carpeta

mkdir script

Donde mkdir (make directory) es el comando para crear carpetas o directorios y script es el nombre que le pondremos a nuestro directorio.

Entramos a la carpeta

cd script/

Donde cd (changue directory) es el comando para cambiar de directorio y script es el nombre que le colocamos a nuestra carpeta.
creamos un archivo con extensión .sh que contendrá al

touch archivo.sh

Donde touch es el comando para crear archivos y script.sh es nuestro archivo con extensión .sh

Le damos permisos de ejecución al archivo

sudo chmod 777 script.sh

Donde sudo (super User do) sirve para acceder como super usuario, chmod (change mod) es para cambiar los permisos, 777 indica que todos los usuarios tendrán todos los permisos y script.sh es el archivo al que le daremos los permisos.

Luego al presionar Enter nos pedirá la contraseña de súper usuario, la ingresamos.

Comprobamos los permisos del archivo

ls -l script.sh

donde ls (list) nos muestra una lista y con la opción -l muestra información de permisos, número de enlaces asociados al archivo, usuario, grupo, tamaño y fecha de última modificación además del nombre y script.sh es el script al que le dimos permiso.

Nos debería aparecer algo como esto

script

Por ultimo abrimos nuestro archivo para comenzar a editarlo. Para ello podemos utilizar cualquier editor de texto de nuestra preferencia , en este caso usaremos gedit

gedit script.sh &

Donde gedit le indica al bash que ejecute el editor sobre el archivo script.sh y el símbolo & nos permite seguir utilizando la terminal así se halla ejecutado el editor desde ella.

Hola Mundo

#! /bin/bash
#Script de Hola Mundo
clear
echo “Hola Mundo”


Explicación del código.

1) El carácter #! se llama Sha Bang y esta en la linea que inicia un script y sirve para indicarle al sistema que lo que viene a continuación es una secuencia de códigos a ser interpretados, en otras palabras, se trata de un numero mágico de dos bytes que es un marcador especial para determinar el tipo de archivo, en este caso, indica que se trata de un script de shell ejecutable.

2)
El carácter # indica que lo que viene a continuación es un comentario.. los comentarios sirven para guiarnos a través del código.


3) El comando clear limpia la pantalla de nuestro terminal


4)
el comando interno echo es una de las instrucciones más simples de la shell. Se encarga de repetir o desplegar en la salida estándar cualquier argumento que se le indique (inclusive comodines), para posteriormente saltar una línea. En pocas palabras nos muestra en la pantalla de nuestro terminal el mensaje Hola Mundo.


Ejecutando el Script

Ahora bien, ya tenemos listo nuestro script ¿pero como demonios lo ejecutamos? Muy sencillo, escribimos en la terminal lo siguiente:

sh script.sh

Otra manera seria

,/script.sh

Nota: Para que el script se ejecute correctamente es necesario que tenga permisos de ejecución.


Hola Mundo en un Archivo de Texto

#! /bin/bash
#Script que crea un archivo y le agrega la cadena Hola Mundo
> ~/Escritorio/archivo.txt
echo “Hola Mundo” > ~/Escritorio/archivo.txt
gedit archivo.txt &


Explicación

1) como ya vimos las dos primeras lineas son el llamado al interprete y un comentario, la tercera nos dice que cree un archivo llamado archivo.txt en el escritorio, el símbolo > es equivalente a touch, osea, sirve para crear un archivo el símbolo ~ es equivalente a la ruta /home/carpeta_personal/, es decir, en la carpeta personal entonces la ruta absoluta de nuestro archivo en este caso es /home/carpeta_personal/Escritorio/archivo.txt

2) La siguiente Linea Imprime la cadena Hola Mundo pero esta vez la imprime dentro de archivo.txt usando >


3) La ultima linea abre el archivo en el editor de texto gedit.


Con este sencillo tutorial tenemos una base para la creación de scripts mas complejos. Todo es cuestión de practica. Espero les sirva de algo.