PDF de programación - Programación con bash

Imágen de pdf Programación con bash

Programación con bashgráfica de visualizaciones

Actualizado el 20 de Marzo del 2021 (Publicado el 14 de Enero del 2017)
1.667 visualizaciones desde el 14 de Enero del 2017
1,0 MB
27 paginas
Creado hace 18a (07/10/2005)
Programación

 con 
bash

1

Índice de contenidos

1. Primer contacto
2. Desvío de la salida y la entrada de los comandos
3. Nombres de ficheros y metacaracteres
4. Comillas y caracteres de escape
5. Tuberías de comunicación: pipes
6. Sustitución de comandos por su salida
7. Secuencias de comandos
8. Expresiones
8.1. Variables
8.2. Variables especiales
8.3. Expresiones aritméticas
8.4. El comando test
9. Rutinas
9.1. Algo más sobre los parámetros
9.2. Valor de retorno
9.3. Variables locales
9.4. Bibliotecas de rutinas
10. Sentencias de control
10.1. case ... in ... esac
10.2. if ... then ... fi
10.3. for ... do ... done
10.4. while ... done
10.5. until ... done

Pág. 3
Pág. 3
Pág. 5
Pág. 6
Pág. 6
Pág. 7
Pág. 8
Pág. 9
Pág. 9
Pág. 13
Pág. 14
Pág. 16
Pág. 17
Pág. 18
Pág. 20
Pág. 21
Pág. 22
Pág. 22
Pág. 23
Pág. 23
Pág. 24
Pág. 25
Pág.
256

2

Un shell es un programa a medio camino entre el usuario y el sistema operativo. En
UNIX hay multitud de shells, pero quizá uno de los más frecuentes es el Bourne Shell y su
mejora Bourne Again Shell (bash). Cada uno de los shells que existen tienen
particularidades que lo hacen único, pero también muchas similitudes que nos permiten, una
vez aprendido uno, trabajar con los demás sin demasiados problemas. En nuestro caso,
trabajaremos con el Bourne Again Shell (bash), ya que es el shell que trae Guadalinex por
defecto.

El desarrollo de esta unidad didáctica o lección está pensado para personas que han
tenido contacto con algún tipo de lenguaje de programación y que conoce los conceptos de
variable, rutina, sentencia de control, ámbitos locales de declaración de identificadores, etc.

1.Primer contacto

En el momento en el que una persona obtiene una cuenta en una máquina UNIX, el
administrador le asigna una shell de trabajo que será el que le dará la bienvenida cada vez
que inicie una sesión en esa máquina.

Para averiguar cuál es el shell de trabajo que le ha asignado su administrador tan sólo
tiene que ejecutar en el terminal el siguiente comando que muestra en pantalla el contenido
de la variable $SHELL. Esta es la variable es la que el sistema utiliza de forma estándar para
guardar el nombre del shell de trabajo.

$ echo $SHELL

Si no aparece la cadena /bin/bash que identifica al deberá cambiar su shell de

trabajo para poder continuar esta lección. Para ello tan sólo debe ejecutar el comando chsh.
Al hacerlo aparecerá una lista con los nombres completos de todos los shell disponibles en
su sistema e instrucciones paso a paso que le permitirán cambiarlo de una forma muy
sencilla.

A lo largo de toda la lección iremos mostrando numerosos ejemplos que nos

3

permitirán ilustrar cada uno de los conceptos estudiados. En algunos de ellos al final de
algunas líneas aparece un texto en castellano precedido del símbolo #. Se trata de
comentarios que bash shell ignora por completo.

2.Desvío de la salida y la entrada de los comandos

El bash shell permite desviar la entrada y la salida de todos los comandos de forma

que estos puedan leer o escribir sus datos en un fichero, en la pantalla, en una línea de
comunicaciones o en cualquier otro dispositivo sin que sea preciso cambiar una sola línea
del código fuente.

Para desviar, por ejemplo, la salida del comando ls a un fichero llamado lst basta

con teclear el siguiente comando:

$ ls ­F > lst

Este comando crea primero el fichero lst y a continuación ejecuta ls, pero

desviando toda la salida que produzca hacia este fichero. También es posible desviar la
salida de un comando añadiéndola a un fichero ya existente. Por ejemplo, si quisiéramos
añadir al fichero anterior la frase "estos eran mis ficheros", bastaría con teclear el siguiente
comando:

$ echo "estos eran mis ficheros" >> lst

Si ahora mostramos en pantalla el contenido de lst obtendríamos el siguiente

resultado:

$ cat lst
a.c b.c buf.c copia/ f1.dat f2.dat f3.dat
estos eran mis ficheros

La entrada estándar también se puede desviar. Por ejemplo, si deseamos enviar al

usuario juan el fichero anterior, podemos indicar al comando mail que lea el texto a enviar
desde este fichero de la siguiente forma:

$ mail juan < lst

También es posible desviar la entrada usando el símbolo <<, pero en este caso el

resultado es diferente. Cuando tecleamos un comando de la forma

$ cmd << palabra

El shell crea un fichero temporal en el que introduce todas las líneas que lea de la

4

entrada estándar hasta encontrar una que contenga tan sólo la palabra indicada. A
continuación ejecuta el comando desviando su entrada a través ese fichero temporal. En
cierto modo, algo como

$ mail juan << fin
Hola Juan, te he enviado el listado de mis ficheros
fin

es equivalente a la secuencia de comandos

$ echo "Hola Juan, te he enviado el listado de mis ficheros" > tmp
$ mail juan < tmp
$ rm tmp

Este tipo de desvío se utiliza de forma casi exclusiva en los programas que

construyamos en el lenguaje del shell. En sesiones interactivas prácticamente no se utiliza.

3.Nombres de ficheros y metacaracteres

Todos los shell de UNIX permiten el uso de metacaracteres para representar de forma

simplificada conjuntos más o menos amplios de nombres de ficheros cuyos nombres
encajan en un cierto patrón. A continuación se muestran los cuatro metacaracteres
existentes:

● *, que concuerda con cualquier cadena de caracteres, incluida la cadena vacía.
● ?, que concuerda tan sólo con un carácter.
● [a1a2 ... an], que concuerda con cualquiera de los caracteres entre los

corchetes. Es posible especificar un rango separando el carácter inicial y final del
mismo mediante un guión. Por ejemplo [a­z] encaja en cualquier letra
minúscula (exceptuando la ñ).

● [!a1a2 ... an], que concuerda con cualquier carácter que no aparezca entre

los corchetes. Como en el caso anterior, es posible especificar rangos de
caracteres usando el guión.

A continuación se muestran varios ejemplos de uso de los metacaracteres:

$ ls ­FR
a.c b.c buf.c copia/ f1.dat f2.dat f3.dat

./copia:
a.c b.c buf.c f1.dat f2.dat f3.dat
$ # ficheros cuyo nombre terminan en .c 
$ls *.c
a.c b.c buf.c

5

$ # ficheros .c cuyo nombre base tiene un carácter 
$ ls ?.c
a.c b.c
$ # ficheros cuyo nombre incluye al menos un dígito
$ ls *[0­9]*
f1.dat f2.dat f3.dat
$ # ficheros .c con nombre base de un carácter bajo el directorio actual
$ ls */?.c
copia/a.c copia/b.c
$ # ficheros cuyo nombre tiene tres caracteres y el central es un punto
$ # en el directorio actual y en los inmediatamente inferiores
$ ls ?.? */?.?
a.c b.c copia/a.c copia/b.c

En el ejemplo hemos mostrado diversos usos de los patrones con el comando ls,

pero se pueden utilizar casi en cualquier lugar y siempre que el shell los encuentra los
sustituye de forma automática por la lista completa de nombres de ficheros que encajan en
el mismo. Por ejemplo:

$ echo "Estos son los ficheros de mi directorio: " *
Estos son los ficheros de mi directorio: a.c b.c c.c

4.Comillas y caracteres de escape

Tal y como hemos podido ver hasta ahora, el shell reserva para uso propio ciertos

caracteres. Algunos de ellos son poco comunes en la escritura, pero otros son de uso
frecuente y se necesita del algún mecanismo que nos permita impedir al shell los interprete
con su significado especial.

El primer mecanismo consiste en escribir esos caracteres entre comillas simples o

dobles. En el primer caso, todo lo que escribamos entre comillas se interpretará literalmente,
esto es, si aparece un * se interpretará como el carácter asterisco y no como la lista de
todos los nombres ficheros en el directorio actual. En el segundo caso tan sólo se
interpretarán literalmente los metacaracteres, mientras que las variables serán sustituidas
por sus valores. De momento tan sólo conocemos la variable $SHELL que nos permite
conocer cuál es el nombre de nuestro shell de trabajo, pero será suficiente para ilustrar el
comportamiento de las comillas.

$ ls
f.dat main.c
$ echo ’$SHELL *’
$SHELL * 
$ echo "$SHELL *"
/bin/bash *
$ echo $SHELL *
/bin/bash a.c b.c buf.c copia f1.dat f2.dat f3.dat

6

Las comillas permiten delimitar una cadena de texto. Si tan sólo queremos interpretar

literalmente un carácter podemos precederlo de una barra invertida.

$ ls
f.dat main.c
$ echo \$SHELL \*
$SHELL *
$ echo "\$SHELL \*"
$SHELL *
$ echo $SHELL *
/bin/bash a.c b.c buf.c copia f1.dat f2.dat f3.dat

5.Tuberías y comunicaciones: pipes

Situaciones en las que la salida de un comando se utiliza como la entrada de otro son

muy frecuentes en la práctica. Por ejemplo, supongamos que deseamos obtener un listado
ordenado alfabéticamente con información acerca de todos los usuarios conectados
actualmente en la máquina. Sabemos que el comando who permite obtener la información
acerca de los usuarios conectados y que sort puede ordenarla alfabéticamente. Una
posible solución es:

$ who > tmp
$ sort < tmp
usuario1 :0 Sep 09 19:53 
usuario2 :1 Sep 09 15:45
$ rm tmp

En este caso hemos usado el fichero tmp para guardar de forma temporal la

información proporcionada por who antes de usar el comando sort. Una forma simplificada
de hacer esto es usar tuberías, tal y como se muestra a continuación:

$ who | sort
usuario1 :0 Sep 09 19:53 
usuario2 :1 Sep 09 15:45

El efecto es similar a la creación de un archivo temporal, con la única diferencia de

que el uso de las tuberías es mucho más eficiente.

Uno de los problemas de las tuberías es que el usuario no puede observar cuál es la
información que corre a través de ellas. Para conseguirlo se puede usar el comando tee f
que toma su entrada estándar y la vuelca en un fichero de nombre f al mismo tiempo que en
su salida estándar. De esta forma, el comando:

$ who | tee who.txt | sort

7

usuario1 :0 Sep 09 19:53 
usuario2 :1 Sep 09 15:45

muestra efectivamente la información ordenada alfabéticamente acerca de los usuarios
conectados, pero también la vuelca el listado (sin ordenar) en el fichero who.txt.

$ cat who.txt
usuario2 :
  • Links de descarga
http://lwp-l.com/pdf712

Comentarios de: Programación con bash (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad