Bash.- Bucles, loops o ciclo

Definición de la wikipedia para bucle (programación):

"Un bucle o ciclo, en programación, es una sentencia que se realiza repetidas veces a un trozo aislado de código, hasta que la condición asignada a dicho bucle deje de cumplirse."

En los scripts de bash son de tres tipos:

  • while
  • for
  • until

Los bucles while son los que ejecutan una rutina mientras se cumpla una condición establecida en el script. Los bucles for son los que van interactuando con el usuario a lo largo de su ejecución. Y los bucles until son los que se ejecutan hasta que se cumpla una condición determinada.

El recurso de Jorge Fuertes para los bucles en bash y otros más se pueden descargar desde:
http://jorgefuertes.com/productos-y-servicios/cursos/curso-sistemas-gnu-linux

 

 

 

Comando.- whoami

El manual dice: "whoami - imprime el identificador de usuario efectivo". Lo que hace es mostrar el nombre del usuario (username) en que estamos. whoami equivale a id -un.

Todas estas son la misma cosa:
Userid (username) | User identifier | UID | User ID | Identificador de usuario

whoami es la concatenación de las palabras en ingles "Who am I?" (¿Quien soy?) Funciona para los sistemas tipo Unix, Windows Vista, Windows 7, y Windows Server 2008.

Sintaxis:

whoami [--help] [--version]

Opciones

--help

Imprime un mensaje del uso por la salida estándar y termina satisfactoriamente.

--version

Imprime información sobre la versión por la salida estándar y termina satisfactoriamente.

Ejemplo:

Ubuntu al usuario que se crea durante la instalación le asigna el número 1000. En mi caso mi primer usuario se llama travesuras; por tanto el UID efectivo es travesuras y el UID real es 1000

Si ejecuto en la terminal:

a)

whoami

b)

id -un

Con ambas me devuelve el UID efectivo, y en mi caso es:

travesuras

Ejemplo de como darle uso:

El otro día estaba haciendo un script para tener mis configuraciones de Gconf favoritas de un solo golpe y no perder tiempo poniendolas una a una. La ruta para el home era un tormento; el ~/ no lo reconoce en todas las configuraciones.

En el caso de la terminal, la imagen de fondo la quiere escrita como /home/[Usuario]/Pictures/ximagen.jpg (sustituye [Usuario] por el nombre del tuyo), nada de ~/Pictures/ximagen.jpg. Logre establecerla escribiendo:

gconftool-2 -t string -s /apps/gnome-terminal/profiles/Default/background_image "/home/`whoami`/Pictures/ximagen.jpg"

Obtener ayuda y el manual

whoami --help

info whoami

man whoami

 

 

 

Comando.- sleep

El comando sleep que fija un tiempo para llevar a cabo una acción. Es como un cronometro, cuando termina la cuenta se realiza la acción que le sigue. Por defecto la cuenta es en segundos; se puede cambiar hasta días con los suffix.

 

Sintaxis

sleep [--help] [--version] numero[smhd]…

 

Suffix

Las unidades de tiempo disponibles y como se especifican son:

  • s       segundos
  • m       minutos
  • h       horas
  • d       días

 

Opciones

--help       Muestra la ayuda y sale

--version       Salida de la información de la versión y sale

 

Ayuda y manual

sleep --help

man sleep

 

Ejemplos de como se usa

El punto y coma (;) en bash sirve para dar varias ordenes en una sola línea; esto es útil en la terminal. En un script se puede usar el punto y coma y los saltos de línea para separar las ordenes.

 

a) Cuando escribimos exit en una terminal, la cierra. Si yo quisiera que eso pasara en un tiempo de 3 segundos, escribo:

sleep 3s; exit

También pude haber escrito:

sleep 3; exit

porque por defecto sleep el tiempo lo toma como segundos.

 

b) Imprimir "Esta es la información de [nombre de usuario]" y después de ella los datos. Todo con un retardo de 1 minuto.

sleep 1m; echo "Esta es la información de `uname -n`"; uname -a

Imprime algo como esto:

Esta es la información de travesuras
Linux travesuras 2.6.32-18-generic #27-Ubuntu SMP Fri Mar 26 21:13:44 UTC 2010 x86_64 GNU/Linux

 

c) Abrir un programa al terminar la cuenta regresiva y además liberar la terminal.

Abrir el gedit al cabo de 30 segundos.

sleep 30s; gedit &

Nota: La terminal queda libre para ejecutar otros comandos por el ampersand (&).

 

 

Comando.- aspell

GNU Aspell es el nombre completo del comando aspell; es un corrector ortográfico. Soporta más de 70 idiomas.

Desarrollador(es):      GNU Aspell developers
Versión estable:      0.60.6 / Abril 16, 2008; (2008-04-16)
Sistema operativo:      Multiplataforma
Tipo:      Corrector ortográfico
Licencia:      LGPL
Página oficial:      http://aspell.net/

  

Instalación

En mi Ubuntu, aspell ya estaba instalado; si no lo esta se puede poner desde synaptic o tecleando en la terminal:

sudo aptitude install aspell

Instalación del diccionario según la lengua:

Español:

sudo aptitude install aspell-es

Ingles:

sudo aptitude install aspell-en

Francés:

sudo aptitude install aspell-fr

Hay más idiomas, se pueden buscar e instalar con ayuda de synaptic.

  

Sintaxis

aspell [options] <command >

  

Consultar la ayuda y manual

La ayuda se obtiene en la terminal tecleando:

aspell --help

Además de la ayuda despliega el Ubuntu que tengo los diccionarios que tengo instalados y otras opciones disponibles.

Con la opción usage, -? despliega un resumen del uso de la salida estándar, de los comandos cortos más comunes y listado de opciones del corrector ortográfico. Se llama con cualquiera de estas dos opciones:

aspell usage

aspell -?

Al manual se puede consultar tecleando en la shell:

man aspell

  

Ejemplos

A) Revisar la ortografía de un documento de texto.

aspell -c ~/travesuras.txt

La opción -c y check es para revisar la ortografía de los archivos.

B) Revisarla ortografía de un documento de texto usando uno de los diccionarios disponibles.

aspell -c -l es ~/travesuras.txt

La opción -l y --lang=<str> establecen con cual lenguaje se usara. La lista de diccionarios disponibles aparece usando la opción --help

  

http://en.wikipedia.org/wiki/GNU_Aspell
http://aspell.net/
http://aspell.net/man-html/index.html

  

  

Comandos.- uname

La Wikipedia dice:

"uname (abreviatura de unix name) es un programa de Unix y sistemas operativos de tipo Unix que imprime el nombre, versión y otros detalles de la máquina y el sistema operativo que se está ejecutando en ella…. La versión de GNU de uname está incluida en los paquetes "sh-utils" o "coreutils". uname no está disponible como programa individual."

 

Sintaxis:

uname [Opcion(es)]

 

Opciones:

Imprimir información del sistema. Sin opciones es lo mismo que -s

-a, --all

imprimir toda la información en el siguiente orden, excepto omitir -p y -i si es desconocido:

-s, --kernel-name

imprimir el nombre del kernel

-n, --nodename

imprimir el host del nodo de la red

-r, --kernel-release

imprimir la versión del kernel

-v, --kernel-version

imprimir la versión del kernel

-m, --machine

imprimir el nombre del hardware de la maquina

-p, --processor

imprimir el tipo de procesador o "desconocido"

-i, --hardware-platform

imprimir la plataforma del hardware o "desconocido"

-o, --operating-system

imprimir el sistema operativo

--help

muestra esta ayuda y finaliza

--version

informa de la versión y finaliza

 

Ejemplos:

a) Con la opción -a, --all imprime toda la información disponible.

uname -a

Muestra algo como esto:

Linux travesuras 2.6.31-20-generic ##57-Ubuntu SMP Mon Feb 8 09:05:19 UTC 2010 i686 GNU/Linux

b) Cuando se escribe uname sin opciones equivale a teclearla con la opción -s

uname

uname -s

Las dos formas son la misma e imprimen esto:

Linux

c) uname -m imprime si el Linux que tenemos instalado es para 32 o 64 bits. Si dice que es i686 la versión es de 32 bits y si muestra x86_64 es para 64 bits.

uname -m

 

http://www.gnu.org/software/coreutils/manual/html_node/uname-invocation.html#uname-invocation
http://es.wikipedia.org/wiki/Uname
http://sliceoflinux.com/2009/08/23/averigua-si-tu-ubuntu-es-de-32-bits-o-64-bits/
Manual y ayuda (teclear en la terminal):

uname --help

man uname

 

Comandos.- more

Según la Wikipedia more:

En computación, more es un comando para ver (pero no modificar) los contenidos de un archivo de texto una pantalla a la vez (visualizador). Esta disponible en Unix y sistemas semejantes, DOS, OS/2 y Microsoft Windows. Programas de este tipo son llamados pagers. more es un buscador buscador, originalmente dejaba navegar hacia adelante en un archivo, aunque una nueva implementación permite un limitado movimiento de regresar.

Desarrollador: Daniel Halbert
Sistema operativo: Multiplataforma
Tipo: system utility
Licencia: BSD License

 

Sintaxis:

more [-dlfpcsu] [-num] [+/ pattern] [+ linenum] [file …]

 

Opciones:

Las opciones de línea de comando descritas más abajo. Las opciones son también tomadas desde la variable de entorno MORE (cerciórece de precederlas con un guión (-)) pero las opciones de líneas de comando las eliminara.

-num

Especificando un número entero muestra en la pantalla ese número de líneas.

Notas: Presionando la q cancela el despliegue de la información. Con Enter se avanza una línea a la vez.

-d

more puede mostrar al usuario el mensaje "[Presione la barra espaciadora para continuar, 'q' para salir]" y puede mostrar [Presione 'h' para instrucciones]" en cambio puede sonar una campana cuando se presiona una tecla ilegal.

Nota: Y aunque no muestre los mensajes están disponibles.

-l

more usualmente trata ^L (form feed) como un carácter especial, y puede detenerse después de una línea que contenga un form feed. La opción -l puede prevenir este comportamiento.

Nota: Solo encontré que form feed en informática es alimentación de hojas en la impresión.

-f

Causes more to count logical, rather than screen lines (i.e., long lines are not folded).

-p

No avanza/retrocede. En cambio, limpia la pantalla antes de mostrar el texto.

-c

No avanza/retrocede. Conforme va mostrando las líneas de texto va eliminando de la promt el anterior.

-s

Squeeze multiple blank lines into one.

-u

Suppress underlining.

+/

The +/ option specifies a string that will be searched for before each file is displayed.

+num

Muestra el resultado a partir del número que se le indico

 

 

Mientras se esta dentro del comando more tienes las siguientes opciones y la lista se despliega si presionas 'h'.

<espacio>

Muestra las siguientes k líneas de texto [por omisión, el tamaño actual de la ventana]

z

Muestra las siguientes k líneas de texto [por omisión, el tamaño actual de la ventana]*

<intro>

Muestra las siguientes k líneas de texto [1]

d o ctrl-D

Desplaza k líneas [tamaño de desplazo actual, inicialmente 11]

q o Q o <interr>

Sale de more

s

Salta hacia adelante k líneas de texto [1]

f

Salta hacia adelante k pantallas de texto [1]

b o ctrl-B

Salta hacia atrás k pantallas de texto [1]

'

Va al sitio donde comenzó la búsqueda anterior

=

Muestra el número de la línea actual

/<expresión regular>

Busca la k-ésima aparición de la expresión regular [1]

n

Busca la k-ésima aparición de la última e.r. [1]

!<orden> o :!<orden>

Ejecuta <orden> en un subshell

v

Inicia /usr/bin/vi en la línea actual

ctrl-L

Redibuja la pantalla

:n

Va al k-ésimo fichero siguiente [1]

:p

Va al k-ésimo fichero anterior [1]

:f

Muestra el fichero actual y el número de línea

. (punto)

Repite la orden anterior.

 

 

Ejemplos:

Ejemplo con la opción -num. Despliega 10 líneas a la vez el comando ls porque se manda por la tubería (|) el resultado hacia el comando more con la opción -num

ls | more -10

Ejemplo con la opción -d

ls | more -d

Presionen h para que muestre la ayuda, la barra espaciadora para continuar y si desea salir la 'q'

 

man -t more | ps2pdf - > Desktop/man-more.pdf
http://m3n3chm0.wordpress.com/2007/04/16/vi-comando-more/
http://en.wikipedia.org/wiki/More_%28command%29
http://www.linuxmanpages.com/man1/more.1.php

 

Tips de comando.- ¿Como forzar nombres con letras y/o vocales mayúsculas para usuarios?

Es con la opción --force-badname de el comando adduser

Por ejemplo si quiero que mi usuario sea Trav3sUras escribo:

sudo adduser --force-badname Trav3sUras

Solo deja utilizar mayúsculas y minúsculas, números, guión bajo (_), puntos, signos y guiones. Están prohibidos los nombre de usuarios que comienzan con guiones y no me dejo utilizar el signo de euros (€). Por compatibilidad con las cuentas de máquina de Samba también se admite $ al final del nombre de usuario.

 

Ayuda de la terminal:

man -t adduser | ps2pdf - > ~/Desktop/adduser-man.pdf
adduser --help > ~/Desktop/adduser-help.txt

Comando.- Redireccionamento de la salida de error patrón (2> y 2>>)

Redireccionamento de la salida de error patrón mandan la salida de errores a un archivo en vez de mostrarla en el prompt. Signo mayor que y un dos (2>) sustituye lo que este en el archivo y un dos más dos signos mayor que (2>>) lo agrega al final. Cuando queremos que no se muestren los errores en la shell pero que tampoco se guarden se mandan a /dev/null. La salida de error patrón crea el archivo destino y si existe trabaja sobre el.

Sintaxis:

[Comando o programa] 2> [Archivo destino de los errores]
[Comando o programa] 2>> [Archivo destino de los errores]
[Comando o programa] 2> /dev/null
[Comando o programa] 2>> /dev/null

 

Ejemplos.-

Tratemos de borrar un archivo que no existe y hagamos que el mensaje de error vaya a un archivo llamado error.txt.

rm ~/travesuras.txt 2> ~/error.txt

 

En la shell no se muestra nada porque el mensaje fue a parar a el archivo error.txt. Al abrirlo (gedit ~/error.txt &) muestra un mensaje parecido a este:

rm: cannot remove `/home/travesuras/travesuras.txt': No such file or directory

 

Ahora hacemos el listado de una carpeta que no existe y mandamos los errores al mismo archivo (~/error.txt):

ls ~/travesuras 2> ~/error.txt

 

Cuando lo abrimos de nuevo vemos que el mensaje ha cambiado por algo como esto:

ls: cannot access /home/travesuras/travesuras: No such file or directory

 

Para que los mensajes de error se acumulen se usa 2>>

Tratemos de borrar otra vez el archivo travesuras.txt, pero ahora usamos 2>>:

rm ~/travesuras.txt 2>> ~/error.txt

 

Abrimos el archivo y nos aparece algo así:

ls: cannot access /home/travesuras/travesuras: No such file or directory
rm: cannot remove `/home/travesuras/travesuras.txt': No such file or directory

 

Esta vez los mensajes de error se agregan al final del archivo.

Por ultimo, si no queremos guardar los mensajes de error los mandamos a /dev/null. Ejemplos:

rm ~/travesuras.txt 2> /dev/null
ls ~/travesuras 2>> /dev/null

 

Cuando tratamos de abrir /dev/null dice que no se puede y los errores no fueron mostrados en la prompt.

 

 

http://wiki.softwarelivre.org/TWikiBar/TWikiBarConversa001

Comando.- Redireccionamento de la Salida Patrón (> y >>)

El signo mayor (>) en la shell significa que la salida de un comando o programa la dirige a archivo. Imaginen que el > es una flecha que apunta para donde van los datos; cuando esta solo un signo mayor (>) sustituye el contenido y cuando son dos (>>) agrega lo nuevo al final.

Carlos me dijo que no es necesario crear un archivo para guardar los datos, el redireccionamiento de la salida patrón (> y >>) se encarga de hacerlo.

Admite varios tipos de archivos, p. ej. txt, html, htm, etc. Si el archivo existe trabaja sobre el y lo crea si no esta.

La sintaxis es:

[Comando o programa] > [Archivo donde se guarda]

 

[Comando o programa] >> [Archivo donde se guarda]

 

Vamos a ver como un signo mayor que (>) sustituye el contenido anterior por el nuevo.

Ejecutamos:

date > Desktop/encadenados.txt

 

Abrimos el archivo:

gedit Desktop/encadenados.txt &

 

Vemos que el contenido es algo como esto:

Sun May 31 21:43:50 MDT 2009

 

Cerramos el archivo y ahora escribimos:

uname -a > Desktop/encadenados.txt

 

Abrimos el archivo y vemos como fue sustituido el escrito anterior por algo así:

Linux travesuras 2.6.24-24-generic #1 SMP Wed Apr 15 15:54:25 UTC 2009 i686 GNU/Linux

 

Podemos seguir con más comandos y/o cadenas, y siempre que usemos el signo mayor que (>) el nuevo texto sustituirá al anterior.

Cuando se necesite tener un registro (ir agregando al final del archivo las nuevas líneas) de los eventos se escriben dos signos mayor que (>>). Esto hace que lo nuevo se anexe al final del archivo.

Escribimos:

uptime >> Desktop/encadenados.txt

 

Abrimos el archivo y nos encontramos con que la salida de uptime fue agregada al final del archivo.

Linux travesuras 2.6.24-24-generic #1 SMP Wed Apr 15 15:54:25 UTC 2009 i686 GNU/Linux
 22:01:27 up  3:15,  2 users,  load average: 0.24, 0.36, 0.46

 

Cerramos el archivo y agregamos algo más.

echo "Traviesa - travesuras" >> Desktop/encadenados.txt

 

Abrimos otra vez el archivo y comprobamos una vez más que se anexo al final la cadena de echo.

Linux travesuras 2.6.24-24-generic #1 SMP Wed Apr 15 15:54:25 UTC 2009 i686 GNU/Linux
 22:01:27 up  3:15,  2 users,  load average: 0.24, 0.36, 0.46
Traviesa - travesuras

 

 

 

 

http://www.gnu.org/software/bash/manual/
http://wiki.softwarelivre.org/TWikiBar/TWikiBarConversa001
http://elqui.dcsc.utfsm.cl/util/shell/macprogramadores.org.BASH.pdf

 

Url corta de este post: http://wp.me/pjHsf-iL

Comandos.- Punto y coma (;)

En la shell se ejecuta un solo comando por línea; a menos que uses punto y coma (;). Cuando falla uno aparece un mensaje de error en el promt y entra en el siguiente comando.

 

Ejemplos.-

a) Crear archivo vacío en el escritorio que se llame traviesa.txt y luego de hacer abra ese archivo con gedit.

touch Desktop/traviesa.txt; gedit Desktop/traviesa.txt

 
 

b) La primera orden lista lo que hay dentro del escritorio y luego abre el nautilus.

ls -l Desktop; nautilus Desktop

 
 

c) Abrir en una sola línea varios programas.

gedit; evince

 
 

d) Ahora algo más complejo. En una sola línea vamos a crear el directorio travesuras dentro del escritorio, entrar a el, hacer un archivo vacío que se llame traviesa.txt, limpiar la pantalla con clear para que aparezca solo un mensaje en la shell diciéndonos: "Listado del directorio travesuras" y lo que hay dentro de la carpeta que hicimos.

mkdir Desktop/travesuras; cd Desktop/travesuras; touch traviesa.txt; clear; echo "Listado del directorio travesuras"; ls -la

 
 

 

 

 

http://html.rincondelvago.com/unix_16.html
http://wiki.softwarelivre.org/TWikiBar/TWikiBarConversa001