Si necesitamos repetir un grupo de acciones mientras se cumpla una condición la mejor opción es la sentencia repetitiva while().
Esta sentencia evalúa una condición y luego realiza las acciones especificadas si esta se cumple.
Modo de uso:
while(condicion)
{
//Acciones
}
Secuencia:
1. Se evalúa la condición.
2. Si la condición se cumple, se realizan las acciones especificadas, si no se cumple, no se ejecuta ninguna acción y se salta a la próxima línea.
3. Se repiten los pasos 1 y 2 mientras se cumpla la condición.
Ejemplos:
Escriba un programa en lenguaje C que solicite el ingreso de dos números (valor inicial y un valor final) y que muestre por pantalla los números que pertenecen al intervalo dado.
Solución:
Este ejercicio lo realizamos capítulos anteriores usando la sentencia for(). Podemos hacer lo mismo con la sentencia while()
Solución:
#include <stdio.h>
void main()
{
//Declaración de variables
int inicial, final, i;
//Solicitando y leyendo el ingreso de datos desde el teclado
printf(«Ingrese el valor inicial: «);
scanf(«%d»,&inicial);
printf(«Ingrese el valor final: «);
scanf(«%d»,&final);
i=0; //inicializando la variable índice
while(i<=final)
{
printf(«%d\n»,i); //mostrando por pantalla los números desde
//el valor inicial hasta el valor final
i++; //incrementando la variable
}
}
2. Escriba un programa en lenguaje C que solicite el ingreso de un número, si este número no es par, que lo vuelva a solicitar, el programa terminará cuando sea ingresado un número par.
Solución:
#include <stdio.h>
void main()
{
//Declaración de variables
int numero;
//Solicitando y leyendo el ingreso de datos desde el teclado
numero=1; //Asegurando que el número sea impar para que la condición se cumpla
while(numero%2!=0)
{
printf(«Ingrese un numero: «);
scanf(«%d»,&numero);
}
}
Saludos a mis lectores,
Dictaré un taller de Shell Script en vivo transmitido vía OpenFuture Solutions (www.openfs.com.ec)
Fecha: Martes 12 de Junio del 2009
Hora: 19:00
Click aquí para entrar a la página donde se transmitirá.
En esta sección estudiaremos comandos indispensables en el manejo de la consola de Unix. Así que comencemos de una vez 🙂
Paseando por el sistema de archivos.
Para movernos de un directorio a otro usamos el comando cd.
Modo de uso:
cd rutaDelDirectorio
Por ejemplo: si nos deseamos ir al directorio /home/user/docs/dir1/dir2 escribimos:
cd /home/user/docs/dir1/dir2
Usando rutas absolutas y relativas
Si estamos en /home/user/docs y deseamos movernos a /home/user/docs/dir1/dir2 escribimos:
cd dir1/dir2
Si estamos en /home/user/docs y deseamos movernos a /home/user podemos escribir
cd /home/user
ó
cd ..
Mostrando el contenido de un directorio.
Para mostrar el contenido de un directorio utilizamos el mandato ls.
Modo de uso:
ls [opciones] ruta
# ls /home/user/nombres
maria eva ana julio veronica
jaime ruth angel eduardo victoria
ls tiene muchas opciones pero las más usadas son -l y -a
la opción -l muestra el contenido del directorio en modo de lista mostrando los permisos, el propietario, el grupo propietario, el tamaño y la fecha de modificación de cada elemento contenido en el directorio, la opción -a muestra todos los elementos contenidos en el directorio, incluidos los archivos ocultos, el directorio actual y el superior (. y .. respectivamente).
Ejemplo:
# ls -l /home/user/ciudades
-rwxrwxrwx 1 root root 22534 mar 25 13:22 guayaquil
-rwxrwxrwx 1 root root 25531 mar 25 13:28 lima
-rwxrwxrwx 1 root root 32499 mar 25 12:12 quito
-rwxrwxrwx 1 root root 16483 mar 21 10:15 bogota
# ls -a /home/user/ciudades
. guayaquil quito
.. lima bogota
combinando estas dos opciones
ls -la /home/user/ciudades
drwxrwxr– 1 root root 8192 mar 25 13:22 .
drwxrwxr– 1 root root 4096 mar 25 13:22 ..
-rwxrwxrwx 1 root root 22534 mar 25 13:22 guayaquil
-rwxrwxrwx 1 root root 25531 mar 25 13:28 lima
-rwxrwxrwx 1 root root 32499 mar 25 12:12 quito
-rwxrwxrwx 1 root root 16483 mar 21 10:15 bogota
Copiando, moviendo y eliminando archivos.
Para copiar se usa el comando cp
Modo de uso:
cp [opciones] rutaOrigen rutaDestino
Ejemplo:
Si deseamos copiar el archivo copiame.txt que se encuentra en /home/user/dir1 a /home/user/respaldo/dir1 escribimos:
cp /home/user/dir1/copiame.txt /home/user/respaldo/dir1/
haciendo esto, se copiará el archivo a la ruta indicada con el mismo nombre, si queremos copiar este archivo con un nombre diferente , por ejemplo que el archivo copiame.txt se copie con el nombre copiado.txt se ejecuta:
cp /home/user/dir1/copiame.txt /home/user/respaldo/dir1/copiado.txt
también podemos copiar directorios y árboles de directorios enteros con la opción -pR
cp -pR /home/user/dir1 /home/user2/
Para mover archivos usamos el comando mv
Modo de uso:
mv rutaOrigen RutaDestino
Por ejemplo si deseamos mover un archivo llamado mueveme.mp3 de /home/user/music a /home/user/music/mp3 escribimos:
mv /home/user/music/mueveme.mp3 /home/user/music/mp3/mueveme.mp3
tambén podemos usar mv para renombrar archivos, por ejemplo si queremos cambiarle el nombre al archivo mueveme.mp3 a renombrado.mp3 escribimos:
mv mueveme.mp3 renombrado.mp3
Si deseamos mover un árbol de dierctorio completo usaremos la opción -vf
Para eliminar un archivo usamos elcomando rm
Modo de uso:
rm [opciones] rutaArchivo
Ejemplo:
Si deseamos eliminar un archivo llamado borrame.doc que se encuentra en /home/user/docs escribimos:
rm /home/user/docs/borrame.doc
Si deseamos que el sistema pida confirmación de cada archivo a borrar usamos la opción -i, si deseamos borrar un árbol de directorios o un directoio no vacío usamos laopción -rf
Si necesitamos repetir un grupo de acciones un número conocido de veces la mejor opción es la sentencia repetitiva for().
for() es una de las sentencias repetitivas más usadas en los lenguajes de programación, esta sentencia inicializa una variable, evalúa una condición y luego realiza una operación sobre una variable.
Modo de uso:
for(inicialización;condición;operacion)
{
//Acciones
}
Secuencia:
Ejemplos:
Escriba un programa en lenguaje C que solicite el ingreso de dos números (valor inicial y un valor final) y que muestre por pantalla los números que pertenecen al intervalo dado.
Solución:
#include <stdio.h> void main() { //Declaración de variables int inicial, final, i; //Solicitando y leyendo el ingreso de datos desde el teclado printf("Ingrese el valor inicial: "); scanf("%d",&inicial); printf("Ingrese el valor final: "); scanf("%d",&final); for(i=inicial;i<=final;i++) { printf("%d\n",i); //mostrando por pantalla los números desde //el valor inicial hasta el valor final } }
Ejemplos:
Escriba un programa en lenguaje C que solicite el ingreso un número entero y que muestre la tabla de multiplicar del mismo.
Solución:
#include <stdio.h> void main() { //Declaración de variables int numero, i, producto; //Solicitando y leyendo el ingreso de datos desde el teclado printf("Ingrese un numero: "); scanf("%d",&numero); for(i=0;i<=12;i++) { producto=i*numero; printf("%d x %d = %d\n",numero,i,producto); } }
Editando archivos
A la hora de editar archivos de texto en la consola de un sistema UNIX la mejor opción es el comando vi.
Modo de uso:
vi rutaArchivo
vi tiene dos modos: modo de edición y modo de comandos.
El modo de edición permite modificar el contenido de un archivo como insertar o borrar caracteres y el modo de comandos permite ingresar comandos de vi como copiar, pegar, guardar, etc.
El programa vi se inicia por defecto en modo de comandos, a continuación se muestra una lista de los comandos más usados.
Comandos de edición de texto en vi
Comando |
Descripción |
i |
Inserta texto antes del carácter sobre el cual se encuentra el cursor (cambia al modo de edición) |
I |
Inserta texto al inicio de una línea (cambia al modo de edición) |
a |
Inserta texto después del carácter sobre el cual se encuentra el cursor (cambia al modo de edición) |
A |
Inserta texto al final de una línea (cambia al modo de edición) |
yy |
Copia una línea de texto |
p |
Pega una línea de texto |
dd |
Corta o elimina una línea de texto |
o |
Inserta una línea en blanco después de la línea en la que se encuentra el cursor (cambia al modo de edición) |
O |
Inserta una línea en blanco antes de la línea en la que se encuentra el cursor (cambia al modo de edición) |
r |
Reemplaza un carácter (se presiona r y luego se ingresa el carácter deseado) |
R |
Inserta texto poniendo el cursor en modo de sobre-escritura (cambia al modo de edición) |
Comandos para la navegación en el archivo
Comando |
Descripción |
j |
Desplaza el cursor hacia abajo |
k |
Desplaza el cursor hacia arriba |
h |
Desplaza el cursor hacia la izquierda |
l |
Desplaza el cursor hacia derecha |
gg |
Desplaza el cursor hacia una línea indicada, si no digitamos algún número antes de usar este comando,entonces desplazará el cursor al inicio del archivo. Ej: si deseamos dirigirnos a la línea 100 escribimos 100gg |
G |
Es equivalente a gg, solo que si no lo predecimos de algún número, entonces desplazará el cursor al final del archivo. |
0 |
Desplaza el cursor al inicio de la línea actual. |
$ |
Desplaza el cursor al final de la línea actual. |
Comandos útiles para la manipulación de vi
Comando |
Descripción |
ZZ |
Guarda los cambios y sale del editor |
:w |
Guarda los cambios en el archivo |
:wq |
Es equivalente al comando ZZ |
:/ |
Busca texto en el archivo. Ej: si deseamos buscar la palabra hola en el archivo usamos el comando :/hola y luego presionamos ENTER, se puede navegar entre las coincidencias encontradas usando n (siguiente) y N (anterior). |
:q |
Permite salir del editor si no se han realizados cambios en el archivo. |
:q! |
Salida de modo forzado, sale del editor sin guardar los cambios realizados al archivo. |
:! |
Permite ingresar un comando en el shell desde vi. Ej: si deseamos conocer la hora escribimos :!date y luego presionamos ENTER |
Para cambiar del modo de edición al modo de comandos se presiona la tecla ESC.
La sentencia switch() en Lenguaje C es una sentencia de selección. Esta sentencia permite seleccionar las acciones a realizar de acuerdo al valor que tome una variable.
Modo de uso:
switch(variable) { case valor_1: //acciones break; case valor_2: //acciones break; . . . case valor_n: //acciones break; defalut: //acciones break; } Si el valor que toma la variable no coincide con los valores especificados en los casos, se realizarán las acciones definidas en la etiqueta default.
Ejemplos:
1. Escriba un programa en Lenguaje C que solicite el ingreso de un número del 1 al 9 y que muestre por pantalla el número seleccionado en letras.
Solución:
#include <stdio.h> void main() { int opcion; printf("Ingrese un numero entero: "); scanf("%d",&opcion); switch(opcion) { case 1: printf("Ha ingresado el numero uno\n"); break; case 2: printf("Ha ingresado el numero dos\n"); break; case 3: printf("Ha ingresado el numero tres\n"); break; case 4: printf("Ha ingresado el numero cuatro\n"); break; case 5: printf("Ha ingresado el numero cinco\n"); break; case 6: printf("Ha ingresado el numero seis\n"); break; case 7: printf("Ha ingresado el numero siete\n"); break; case 8: printf("Ha ingresado el numero ocho\n"); break; case 9: printf("Ha ingresado el numero nueve\n"); break; defalut: printf("Ha ingresado un numero no valido\n"); break; } }
2. Escriba un programa en Lenguaje C que solicite el ingreso de dos números enteros y que luego permita seleccionar si se sumarán, restarán dividirán o multiplicarán y muestre el resultado por pantalla.
Solución:
#include <stdio.h> void main() { int opcion,a,b,resultado; printf("Ingrese un numero entero [a]: "); scanf("%d",&a); printf("Ingrese un numero entero [b]: "); scanf("%d",&b); printf("Menu\n"); printf("1. Sumar\n"); printf("2. Restar\n"); printf("3. Dividir\n"); printf("4. Multiplicar\n"); printf("Elija una operacion: "); scanf("%d",&opcion); switch(opcion) { case 1: resultado=a+b; printf("%d + %d = %d\n",a,b,resultado); break; case 2: resultado=a-b; printf("%d - %d = %d\n",a,b,resultado); break; case 3: resultado=a/b; printf("%d / %d = %d\n",a,b,resultado); break; case 4: resultado=a*b; printf("%d x %d = %d\n",a,b,resultado); break; defalut: printf("Opcion no valida\n"); break; } }
Caracteres en UNIX
En Unix, los caracteres tecleados son enviados al sistema, el cual los devuelve para ser mostrados en pantalla salvo el caso de cuando ingresamos un password, la clave no se mostrará y tampoco mostrará caracteres como ***.
La mayoría de los caracteres del teclado son ordinarios, sin embargo, exiten otros con funciones especiales com es el caso de la tecla ENTER (o RETURN), esta tecla indica al sistema que los caracteres enviados por teclado deben interpretarse para ser procesados, luego de esto el sistema retroalimenta al usuario y desplaza el cursor a una nueva línea.
También existen caracteres que no aparecen en el teclado, y por lo general son el resultado de una combinación de teclas como es el caso de Ctrl-m, el cual es equivalente a presionar la tecla ENTER; Estos caracteres se llaman caracteres de control.
A continuación un listado de los caracteres de control más usados en consolas UNIX:
Ctrl-d –> Indica a un programa que no hay más datos de entrada. Esta combinación de carcateres cierra la sesión si no se está escribiendo o ejecutando nada en consola.
Ctrl-g –> Acciona la campana del PC.
Ctrl-h –> Carácter de retroceso, es equivalente a la tecla BACKSPACE.
Ctrl-i –> Tabulador, es equivalente a la tecla TAB.
Ctrl-c –> Interrumpe cualquier programa en ejecución.
Mandatos Básicos
Si deseamos conocer la fecha y hora debemos usar el comando date
$ date
sáb feb 14 23:04:12 ECT 2009
Si deseamos conocer qué usuarios están utilizando la máquina usamos el comando who
$ who
root tty1 2009-02-14 23:08
leonardo :0 2009-02-14 19:14 (console)
En Unix cada usuario del equipo posee una bandeja de correo, la cual puede ser consultada con el comando mail
$ mail
Heirloom mailx version 12.2 01/07/07. Type ? for help.
«/var/spool/mail/leonardo»: 1 message 1 new
>N 1 root@linux-uu97.si Sat Feb 14 23:29 18/653 Se te acaba el espacio
?
Al usar el comando mail el sistema nos informa cuantos mails tengo en mi bandeja de entrada (almacenados y no leidos), para acceder a cada mail se presiona enter y nos aparecerá algo parecido a lo siguiente:
Message 1:
From root@linux-uu97.site Sat Feb 14 23:29:38 2009
X-Original-To: leonardo
Delivered-To: leonardo@linux-uu97.site
Date: Sat, 14 Feb 2009 23:29:37 -0500
To: leonardo@linux-uu97.site
Subject: Se te acaba el espacio
User-Agent: Heirloom mailx 12.2 01/07/07
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
From: root@linux-uu97.site (root)
Te quedan 3000MB disponibles en tu disco duro, por favor compra otro.
Si deseamos eliminar el mensaje solo escribimos d y presionamos enter.
Si deseamos salir del programa presionamos Ctrl-d.
Si deseamos enviar un mail un usuario se escribe: mail nombreUsuario
Por ejemplo:
Si deseo enviar un correo al usuario rubi
$ mail rubi
Subject: Te hecho de menos
Espero ansioso conversar contigo de nuevo
?
Para enviar el mensaje al usuario presionamos Ctrl-d.
Estos comandos son muy básicos pero tienen mucha utilidad…
Más adelante veremos muchos comandos más… Espero vuestros comentarios 🙂
En la programación es escencial el manejo de bifurcaciones (si-entonces), en el Lenguaje C se usa la sentencia if().
Modo de Uso
if(condicion)
{
Acciones
}
Las acciones dentro de las llaves {} se ejecutarán siempre y cuando se cumpla la condición especificada entre los peréntesis (). También es posible omitir las llaves si se fuera a ejecutar una sola acción.
La condición puede ser cualquier expresión lógica como por ejemplo a<=b ó x!=0 ó z+10<a&&b>0, etc.
Ejemplos:
1. Escriba un programa en Lenguaje C que solicite el ingreso de un número entero e indique si es mayor que cero y si es par.
Solución:
#include <stdio.h> void main() { int a; printf("Ingrese un numero: "); scanf("%d",&a); if(a>0) printf("El numero es mayor que cero\n"); if(a%2==0) printf("El numero ingresado numero es par\n"); } 2. Escriba un programa en Lenguaje C que solicite el ingreso de un número entero por teclado, si el número es menor que 12 lo incremente en uno y lo multiplique por diez; si el número ingresado es mayor o igual que 12 lo multiplique por diez y luego lo incremente en uno. Mostrar el resultado por pantalla. Solución: #include <stdio.h> void main() { int a; printf("Ingrese un numero: "); scanf("%d",&a); if(a<12) { a++; a*=10; } if(a>=12) { a*=10; a++; } printf("El resultado es: %d\n",a); //Nótese que el orden es importante XD } El lenguaje C también soporta el uso de una estructura si-entonces, sino.Para esto se usa la sentencia else. Veamos otra variante del ejemplo 2 usando la sentencia else #include <stdio.h> void main() { int a; printf("Ingrese un numero: "); scanf("%d",&a); if(a<12) { a++; a*=10; } else //Si un número no es menor que 12, entonces es mayor o igual al mismo { a*=10; a++; } printf("El resultado es: %d\n",a); }
Saludos a todos mis lectores 🙂
He decidido crear una sección dedicada a la creación de Scripts sobre la shell de sistemas basados en Unix, los cuales son muy importantes ya que nos ayudarán mucho en la administración de estos sistemas.
Espero les sea de utilidad…
Manos a la obra
Conceptos básicos
Antes de entrar en el entorno de programación Unix es necesario tener conceptos básicos sobre estos sistemas operativos y el manejo de la consola.
¿Que es Unix?
Unix es el núcleo de un sistema operativo de tiempo compartido, un programa que controla los recursos de un equipo y los asigna entre los usuarios. Unix no solo abarca el núcleo, sino también todos los programas esenciales para el manejo del mismo como: editores, compiladores, y lenguajes de comandos, etc.
¿Qué es la Shell?
Es un programa que sirve de interfaz de comunicación entre el usuario y el sistema operativo que espera órdenes escritas por el usuario.
Sistema de archivos en Unix
En Unix todo funciona a base de archivos, todo lo que existe en Unix son archivos (directorios, drivers, ficheros, etc).
El sistema de archivos Unix se organiza de manera Jerárquica.
En Unix los archivos tienen asociado un nombre, contenido, ubicación y datos como dueño, tamaño, fecha de modificación, etc.
Un directorio en Unix es un archivo que contiene información de otros archivos, ya que el sistema de archivos un directorio es una ubicación que puede almacenar archivos y otros directorios.
En los sistemas Unix todo es contenido por el directorio raíz /. Este directorio es el de más alta jerarquía.
Rutas
Las rutas son un método de referenciar archivos y directorios en un sistema de archivos las cuales señalan la ubicación exacta de los mismos.
La forma de recorrer un árbol de directorios en Unix se lo hace directorio a directorio separándolos con la barra invertida «/».
Existen 2 formas de representar rutas en Unix, de manera absoluta y relativa.
Ruta absoluta: Señala la posición de un archivo o directorio desde el directorio raíz.
Ejemplo: /home/leo/Escritorio/carpeta1/
Ruta Relativa: Señala la posición de un archivo o directorio desde la ubicación actual.
Ejemplo:
Nos encontramos en /home ¿cuál es la ruta relativa a /home/leo/Escritorio/carpeta1?
La ruta relativa es leo/Escritorio/carpeta1
En las rutas relativas se usan dos representaciones especiales a directorios ./ y ../, el primero (./) hace referencia al directorio actual y el segundo (../) hace referencia al directorio superior. Veamos algunos ejemplos:
Estamos ubicados en /home/leo/Escritorio/carpeta1 ¿cuál es la ruta relativa a /home/leo/Escritorio y a /home/leo?
La ruta relativa a /home/leo/Escritorio es ../
La ruta relativa a/home/leo es ../../
Nótese que en el caso de la ruta relativa a /home/leo desde /home/leo/Escritorio/carpeta1 ésta fue ../../ porque se indica que es el directorio superior al directorio superior de carpeta1
El lenguaje C permite manejar una gran variedad de operadores como lo son: Operadores aritméticos, lógicos, de asignación, relacionales.
Operadores Aritméticos
Operador | Nombre | Descripción | Sentido |
+ | Suma | Suma dos números | De izquierda a derecha |
– | Resta | Resta dos números | De izquierda a derecha |
/ | División | Divide dos números | De izquierda a derecha |
* | Producto | Multiplica dos números | De izquierda a derecha |
% | Resto | Calcula el resto de una división | De izquierda a derecha |
Operadores Lógicos
Operador | Nombre | Descripción | Sentido |
! | No lógico | Realiza la operación lógica NOT | De izquierda a derecha |
&& | Y lógico | Realiza la operación lógica AND | De izquierda a derecha |
|| | Ó lógico | Realiza la operación lógica OR | De izquierda a derecha |
Operadores Relacionales
Operador | Nombre | Descripción | Sentido |
== | Igual a | Compara dos valores y devuelve verrdadero (1) si son iguales. | De izquierda a derecha |
!= | Diferente de | Compara dos valores y devuelve verrdadero (1) si son diferentes. | De izquierda a derecha |
> | Mayor que | Compara dos valores y devuelve verrdadero si el izquierdo es mayor que el derecho. | De izquierda a derecha |
>= | Mayor o igual que | Compara dos valores y devuelve verrdadero si el izquierdo es mayor o igual que el derecho. | De izquierda a derecha |
< | Menor que | Compara dos valores y devuelve verrdadero si el izquierdo es menor que el derecho. | De izquierda a derecha |
<= | Menor o igual que | Compara dos valores y devuelve verrdadero si el izquierdo es menor o igual que el derecho. | De izquierda a derecha |
Operadores de asignación
Operador | Nombre | Descripción | Sentido |
++ | Incremento | Incrementa en uno al valor actual de una variable | |
— | Decremento | Decrementa en uno al valor actual de una variable | |
= | Asignación | Asigna un valor dado a una variable | De derecha a izquierda |
+= | Incremento de | Incrementa en una cantidad dada al valor de una variable | De derecha a izquierda |
-= | Decremeto de | Decrementa en una cantidad dada al valor de una variable | De derecha a izquierda |
*= | Asignación del producto | Multiplica al valor de una variable con un número dado y se lo asigna a la misma. | De derecha a izquierda |
/= | Asignación de la división | Divide al valor de una variable para un número dado y se lo asigna a la misma. | De derecha a izquierda |
En el caso de los operadores incremento y decremento, se los puede colocar a la derecha
de la variable (operación post-incremento/decremento) o a la izquierda (operación
pre-incremento/decremento). Al usar estos operadores en modo post-incremento/decremento
primero se evalúa la variable y luego se le suma o resta 1. En el caso de los operadores
pre-incremento/decremento primero se le suma o resta 1 al valor de la variable y luego
se evalúa la misma.
Ejemplos:
Post-Incremento #include <stdio.h> void main(){ int a,b; a=10; b=a++; //A la variable b se le asigna el valor de a; luego el valor //de la variable a se incrementa en 1 }
Pre-Incremento
#include <stdio.h> void main() { int a,b; a=10; b=++a; //El valor de a es incrementado en 1 y luego este valor es asignado a //la variable b }