Script

De doc.ubuntu-es
(Diferencias entre revisiones)
Saltar a: navegación, buscar
(Entrada/Salida)
Línea 265: Línea 265:
  
 
Note como las comillas simples y el carácter \ hacen que Bash ignore la función del carácter especial $. Siempre las comillas simples harán que se ignore todos los meta caracteres encerrados entre ellas y \ solo el que sigue después.
 
Note como las comillas simples y el carácter \ hacen que Bash ignore la función del carácter especial $. Siempre las comillas simples harán que se ignore todos los meta caracteres encerrados entre ellas y \ solo el que sigue después.
 +
 +
==Condicionales==
 +
 +
Los condicionales son claves para "explicarle" a la máquina como debe proceder en una tarea cualquiera,  esto se hace casi como si se estuviera explicando una tarea a ejecutar a otra persona.
 +
 +
==='''IF-THEN FI'''===
 +
 +
 +
El condicional por excelencia tiene seis palabras claves que son '''if''', '''elif''', '''else''', '''then''' y '''fi'''.
 +
Donde las palabras tienen un significado comunicativo (en Inglés) casi literal, tal y cual se tratara con otra persona y que Bash por defecto las entienda con ese significado.
 +
*'''if'''   
 +
'''si''' condicional (de si esto o lo otro)
 +
*'''elif''' 
 +
'''también si''' (contracción de else if)
 +
*'''else'''
 +
'''De cualquier otra manera'''
 +
*'''then'''
 +
'''Entonces'''
 +
*'''fi'''
 +
'''if invertido''', indica que se acabó la condicional abierta con if
 +
 +
Solo son imprescindibles en la estructura del Script if, then y fi.
 +
Supongamos ahora que es usted el jefe de una oficina y  tiene una secretaria y que por alguna razón le han pedido que envíe  una copia de cualquier documento que lo identifique; normalmente le diría a la secretaria algo así:
 +
 +
"Maria, por favor, busca en el archivo alguna identificación"  (condición a evaluar)
 +
'''if'''  "si es una copia del pasaporte"  (primer resultado de la condición); '''then''' (entonces)
 +
" envíala por fax a...."  (equivalente al comando a ejecutar)
 +
'''elif'''    "si es de la licencia de conducción"  (segundo resultado de la condición); '''then'''
 +
"envíala por correo"  (otro comando a ejecutar)
 +
'''elif'''  " si es del carnet de identidad"  (tercer resultado de la condición); '''then'''
 +
"envíala con un mensajero " (otro comando diferente)
 +
'''else''' "de cualquier otra manera"
 +
"pasa un fax diciendo que la enviaré mañana"  (otro comando)
 +
'''fi'''
 +
 +
Observe que la acción a ejecutar (equivalente al comando) se hace si la condición se evalúa como verdadera de lo contrario se ignora y se pasa a la próxima, si ninguna es verdadera se ejecuta finalmente la acción después del else.
 +
La sintaxis de bash  se debe tener en cuenta  a la hora de escribir el guión o de lo contrario Bash no entenderá lo que usted quiso decirle,
 +
Pongamos ejemplos de guiones reales
 +
Guión 5
 +
#!/bin/bash
 +
VAR1=Pablo
 +
VAR2=Pedro
 +
if [ "$VAR1" = "$VAR2" ]; then 
 +
echo Son iguales
 +
else
 +
echo Son diferentes
 +
fi
 +
Los corchetes son parte de la sintaxis de Bash y en realidad son un atajo (shortcut) al programa test que es el que ejecuta la acción de comparación.
 +
Observe siempre los espacios vacíos entre los elementos que conforman la linea de comandos (excepto entre el último corchete y el ;), recuerde que ese espacio vacío por defecto Bash lo interpreta como final de un elemento y comienzo de otro.
 +
Si corre este guión siempre se imprimirá a pantalla  Son diferentes, ya que la condición es falsa. Pero si cambia el valor de VAR2=Pablo entonces se imprime Son iguales.
 +
Guión 6
 +
Un guión que verifica si existe un directorio y si no existe lo crea e imprime mensajes a pantalla comunicando la acción ejecutada.
 +
#!/bin/bash
 +
DIR=~/fotos  (crea como variable el directorio /home/fotos)
 +
if [ ! -d "$DIR" ]; then  (verifica si  no existe el directorio)
 +
mkdir "$DIR"  (si la condición es cierta, no existe el directorio, lo crea)
 +
if [ $? -eq 0 ]; then (verifica si la acción se ejecutó sin errores, de serlo imprime lo que sigue)
 +
echo "$DIR" ha sido creado..."
 +
else  (de lo contrario imprime)
 +
echo "Se produce un error al crear "$DIR"
 +
fi (Se cierra la condición abierta en la realización del directorio segundo if)
 +
else ( de lo contrario, relativo al primer if)
 +
echo "Se usará "$DIR" existente"
 +
fi
 +
En este guión pueden verse varias cosas nuevas:
 +
1.- El carácter ! niega la acción, si se hubiera escrito if [ -d "$DIR" ] lo que se estaba evaluando era la condición ¿existe el directorio"$DIR"? pero al colocar ! se evalúa lo contrario.
 +
2.- El carácter ~ significa el /home del usuario.
 +
3.- La expresión -eq se utiliza cuando quieren compararse valores numéricos, y significa =
 +
4.- Se usa una de las variables del sistema "$?" explicada mas arriba.
 +
5.- Pueden utilizarse unos condicionales dentro de otros siempre que se cierren apropiadamente.
 +
Guión 7
 +
#!/bin/bash
 +
echo "Diga si o no:"
 +
read VAR
 +
if  [ "$VAR" = si ]; then
 +
echo "Escribiste -si-"
 +
elif [ "$VAR" = no ]; then
 +
echo "Escribiste -no-"
 +
elif [ "$VAR" = "" ]; then
 +
echo "No puede dejarlo en blanco"
 +
else
 +
echo "Lo que escribió no se acepta"
 +
fi
 +
Observe que se está evaluando varias opciones de la misma condición por lo que lo apropiado es incorporar los respectivos elif dentro de la misma condicional.
 +
Un elemento nuevo que se incorpora aquí es la condición " " que quiere decir "la variable está vacía", en este caso, cuando no se escribió nada.
 +
 +
===CASE-IN ESAC===

Revisión de 21:46 11 feb 2008

Contenido

Definición

Un Script (o guion) para Bash es un archivo de texto que contiene una sucesión de comandos de Shell que pueden ejecutar diversas tareas de acuerdo al contenido del texto del guión. De esta forma pueden automatizarse muchas acciones para alguna necesidad particular o para la administración de sistemas. El guión debe escribirse en un orden lógico pues Bash ejecutará el guión en el orden en que se escriben las lineas, de la misma forma que cuando se realiza una tarea cualquiera por una persona, por ejemplo; primero hay que poner la escalera y luego subirse.

Los Scripts de Bash deben tener siempre como primera linea del guión el texto, para que el Sistema Operativo ejecute la acción usando el programa Bash.

#!/bin/bash

Una vez escrito el Script y guardado en el disco en alguno de los directorios "bin" con el nombre y permiso de ejecución apropiados, se invoca, escribiendo en la consola el nombre del guión. Si el guión tiene una interfaz gráfica se invoca como otro programa cualquiera, uno o dos clic sobre el guión o su icono. Este puede escribirse en cualquiera de los editores de texto de Linux, por ejemplo Kwrite y será ya un guión funcional cuando se salve a alguno de los "bin".

Nota: Es buena práctica cuando se escribe un guión salvarlo apenas se hayan escrito las primeras línea para ir comprobando su funcionamiento e ir corrigiendo los problemas.

Variables

Es impensable elaborar Scripts de Bash sin el uso de las variables. Una variable es una estructura de texto (una letra, un número o sucesiones de ellos) que representa alguno de los elementos que varían en valor y/o significado en el entorno de la Shell, sirviendo como elemento básico de entrada/salida de valores a y desde los comandos en su ejecución consecutiva. Para invocar una variable se utiliza el carácter especial $ precediendo al nombre de la variable.

Exixten dos tipos de variables:

Variables intrínsecas de Bash.

Estas son elaboradas por defecto por el propio Bash y son:

  • $0

Nombre del guión

  • $1....$n

Variables que almacenan los n argumentos (opciones) proporcionados al comando.

  • $#

Variable que contiene el total de los argumentos proporcionados.

  • $*

Conjunto de los argumentos.

  • $?

Valor de ejecución del comando anterior, si es cero es que el comando anterior se ejecutó sin errores, de lo contrario hubo algún error.

  • $$

Identifica el proceso del guión.

  • $!

Identifica el último proceso arrancado en el trasfondo (background).

Variables creadas por el programador.

Las variables pueden ser creadas en cualquier momento, pero siempre antes de su utilización de manera muy simple, se escribe:

nombre_variable=valor_variable

en cualquier momento posterior a la creación si se coloca $nombre_variable dentro del entorno de la Shell el sistema colocará allí valor_variable.

SALUDO=Bienvenido

En cualquier momento posterior si se pone $SALUDO, Bash colocará ahí Bienvenido.

Una variable también puede ser la salida de un comando si ponemos al principio y final del mismo un acento invertido.

SALIDA=`comando`   

le indicará al sistema que donde se escriba $SALIDA debe poner la salida de ese comando. Es práctica común utilizar mayúsculas para las variables a fin de identificarlas fácilmente dentro del guión.

Cuando se ejecutan Scripts que pueden ser "hijos" de otro guión en ocasiones es necesario exportar las variables, esto se hace escribiendo;

export nombre_variable

Caracteres especiales

Existe un grupo de caracteres especiales (también llamados meta caracteres) que tienen significado propio para Bash. Algunos son:

  • \

Le indica a Bash que ignore el carácter especial que viene después.

  • " "

Cuando se encierra entre comillas dobles un texto o una variables si esta es una frase (cadena de palabras) Bash lo interpretará como una cadena única.

  • $

Identifica que lo que le sigue es una variable.

  • ' '

Las comillas simples se usan para desactivar todos los caracteres especiales encerrados dentro de ellas, así tenemos que si escribe '$VARIABLE' Bash interpreta literalmente lo escrito y no como variable.

  • #

Cuando se coloca este carácter dentro de una linea del guión, Bash ignora el resto de la linea. Muy útil para hacer comentarios y anotaciones o para inhabilitar una linea de comandos al hacer pruebas.

  • ;

Este carácter se usa para separar la ejecución de distintos comandos en una misma linea de comandos.

  • ``

Se utiliza como se explicó en el punto anterior, para convertir la salida de un comando en una variable. El comando en cuestión se ejecuta en una sub shell.

También están |, (), !, >, <, cuyo significado se verá mas adelante. El espacio es otro carácter especial y se interpreta por bash como el separador del nombre del programa y las opciones dentro de la linea de comandos, por esta razón es importante encerrar entre comillas dobles el texto o las propias variables cuando son una frase de varias palabras.

Otro carácter que debe evitarse en lo posible su uso es el guión (-) ya que para la mayoría de los programas se usa para indicarle al propio programa que lo que sigue es una de sus opciones, de manera tal por ejemplo, si usted crea un archivo con nombre -archivo (en caso que pueda) después será difícil borrarlo ya que rm (programa que borra) tratará el archivo como una de sus opciones (al "ver" el Script) y dará de error algo así, "Opción -archivo no se reconoce".

Palabras especiales

Hay un grupo de palabras que tienen significado especial para bash y que siempre que se pueda deben evitarse cuando se escriben lineas de comandos para no crearle "confusiones" algunas son: exit, break, continue, true, false, return etc... cuyo significado es mas o menos así:

  • exit

Se sale del guión

  • break

Se manda explícitamente a salir de un ciclo

  • continue

Se manda explícitamente a retornar en un ciclo

  • return

Como exit pero solo se sale del comando u operación sin cerrar el guión

  • true

Indica que una condición es verdadera

  • false

Indica que una condición es falsa

Argumentos propios de bash

Bash como programa tiene algunos argumentos útiles y propios que se usan con frecuencia en la elaboración de Scripts en los condicionales vinculados a la determinación de elementos sobre los archivos, variables, cadenas de palabras o cadenas de pruebas, los mas comunes son:

Argumentos de Archivos Cierto si.... (salida 0)
-d Archivo existe y es un directorio
-c Archivo existe y es de caracteres
-e Archivo existe
-h Archivo existe y es un vínculo simbólico
-s Archivo existe y no está vacío
-f Archivo existe y es normal
-r Tienes permiso de lectura del archivo
-w Tienes permiso de escritura en el archivo
-x Tienes permiso de ejecución del archivo
-O Eres propietario del archivo
-G Perteneces al grupo que tiene acceso al archivo
-n Variable existe y no es nula
Archivo1 nt Archivo2 Archivo1 es mas nuevo que Archivo2
Archivo1 -ot Archivo2 Archivo1 es mas viejo que Archivo2
Agumentos de cadenas Cierto si
-z La cadena está vacía
-n La cadena no está vacía
cadena1 = cadena2 Si las cadenas son iguales
cadena1 != cadena2 Si las cadenas son diferentes
cadena1 < cadena2 Si la cadena 1 va antes en el orden lexicográfico
cadena1 >cadena2 Si la cadena 1 va despues en el orden lexicográfico


















Entrada/Salida

En algunas ocasiones será necesario leer ciertas variables desde el teclado o imprimirlas a la pantalla, para imprimir a la pantalla se pueden invocar dos programas en la linea de comandos:


  • echo
  • printf

(que es un echo mejorado)


Y para leer desde el teclado se usa:


  • read


Si hacemos un read sin asignar variable, el dato de almacena en $REPLY una variable del sistema. Tanto el comando echo como read tienen sus propias opciones.

Ejemplos:

  1. Si creamos en una linea del Script una variable como un comando y queremos imprimir la variable a la pantalla podemos hacer algo así:
VARIABLE=`comando`
echo "$VARIABLE" 

La palabra $VARIABLE está puesta entre comillas dobles para que se imprima todo el texto ignorando los espacios entre palabras.

  1. Si escribimos en una linea del guión
read PREGUNTA

habremos creado una variable de nombre PREGUNTA así es que si luego ponemos

echo "$PREGUNTA"

Se imprimirá a la pantalla lo que se escribió en el teclado al presionar la tecla Enter.

Con los elementos tratados hasta aquí ya podemos escribir nuestros primeros guiónes

Guión 1

#!/bin/bash
echo Hola mundo

Cuando se corre este guión se imprimirá a la pantalla Hola mundo

Guión 2 Lo mismo usando una variable

#!/bin/bash
VARIABLE=Hola mundo
echo "$VARIABLE"

Nótese la variable entre comillas dobles para que imprima todo el texto.

Guión 3 Cuando se usan mas de una variable

#!/bin/bash
VARIABLE=Hola
SALUDO=mundo
echo "$VARIABLE""$SALUDO"

En los tres casos se imprimirá a la pantalla Hola mundo

Guión 4 Si se usan caracteres especiales la cosa puede cambiar

#!/bin/bash
VAR=auto
echo "Me compré un $VAR"     Imprimirá Me compré un auto
echo 'Me compré un $VAR'     Imprimirá Me compré un $VAR
echo "Me compré un \$VAR"    Imprimirá  Me compré un $VAR

Note como las comillas simples y el carácter \ hacen que Bash ignore la función del carácter especial $. Siempre las comillas simples harán que se ignore todos los meta caracteres encerrados entre ellas y \ solo el que sigue después.

Condicionales

Los condicionales son claves para "explicarle" a la máquina como debe proceder en una tarea cualquiera, esto se hace casi como si se estuviera explicando una tarea a ejecutar a otra persona.

IF-THEN FI

El condicional por excelencia tiene seis palabras claves que son if, elif, else, then y fi. Donde las palabras tienen un significado comunicativo (en Inglés) casi literal, tal y cual se tratara con otra persona y que Bash por defecto las entienda con ese significado.

  • if

si condicional (de si esto o lo otro)

  • elif

también si (contracción de else if)

  • else

De cualquier otra manera

  • then

Entonces

  • fi

if invertido, indica que se acabó la condicional abierta con if

Solo son imprescindibles en la estructura del Script if, then y fi. Supongamos ahora que es usted el jefe de una oficina y tiene una secretaria y que por alguna razón le han pedido que envíe una copia de cualquier documento que lo identifique; normalmente le diría a la secretaria algo así:

"Maria, por favor, busca en el archivo alguna identificación"  (condición a evaluar)
if  "si es una copia del pasaporte"  (primer resultado de la condición); then (entonces)
" envíala por fax a...."  (equivalente al comando a ejecutar)
elif    "si es de la licencia de conducción"   (segundo resultado de la condición); then
"envíala por correo"   (otro comando a ejecutar)
elif  " si es del carnet de identidad"  (tercer resultado de la condición); then
"envíala con un mensajero " (otro comando diferente)
else "de cualquier otra manera"
"pasa un fax diciendo que la enviaré mañana"  (otro comando)
fi 

Observe que la acción a ejecutar (equivalente al comando) se hace si la condición se evalúa como verdadera de lo contrario se ignora y se pasa a la próxima, si ninguna es verdadera se ejecuta finalmente la acción después del else. La sintaxis de bash se debe tener en cuenta a la hora de escribir el guión o de lo contrario Bash no entenderá lo que usted quiso decirle, Pongamos ejemplos de guiones reales Guión 5

  1. !/bin/bash

VAR1=Pablo VAR2=Pedro if [ "$VAR1" = "$VAR2" ]; then echo Son iguales else echo Son diferentes fi Los corchetes son parte de la sintaxis de Bash y en realidad son un atajo (shortcut) al programa test que es el que ejecuta la acción de comparación. Observe siempre los espacios vacíos entre los elementos que conforman la linea de comandos (excepto entre el último corchete y el ;), recuerde que ese espacio vacío por defecto Bash lo interpreta como final de un elemento y comienzo de otro. Si corre este guión siempre se imprimirá a pantalla Son diferentes, ya que la condición es falsa. Pero si cambia el valor de VAR2=Pablo entonces se imprime Son iguales. Guión 6 Un guión que verifica si existe un directorio y si no existe lo crea e imprime mensajes a pantalla comunicando la acción ejecutada.

  1. !/bin/bash

DIR=~/fotos (crea como variable el directorio /home/fotos) if [ ! -d "$DIR" ]; then (verifica si no existe el directorio) mkdir "$DIR" (si la condición es cierta, no existe el directorio, lo crea) if [ $? -eq 0 ]; then (verifica si la acción se ejecutó sin errores, de serlo imprime lo que sigue) echo "$DIR" ha sido creado..." else (de lo contrario imprime) echo "Se produce un error al crear "$DIR" fi (Se cierra la condición abierta en la realización del directorio segundo if) else ( de lo contrario, relativo al primer if) echo "Se usará "$DIR" existente" fi En este guión pueden verse varias cosas nuevas: 1.- El carácter ! niega la acción, si se hubiera escrito if [ -d "$DIR" ] lo que se estaba evaluando era la condición ¿existe el directorio"$DIR"? pero al colocar ! se evalúa lo contrario. 2.- El carácter ~ significa el /home del usuario. 3.- La expresión -eq se utiliza cuando quieren compararse valores numéricos, y significa = 4.- Se usa una de las variables del sistema "$?" explicada mas arriba. 5.- Pueden utilizarse unos condicionales dentro de otros siempre que se cierren apropiadamente. Guión 7

  1. !/bin/bash

echo "Diga si o no:" read VAR if [ "$VAR" = si ]; then echo "Escribiste -si-" elif [ "$VAR" = no ]; then echo "Escribiste -no-" elif [ "$VAR" = "" ]; then echo "No puede dejarlo en blanco" else echo "Lo que escribió no se acepta" fi Observe que se está evaluando varias opciones de la misma condición por lo que lo apropiado es incorporar los respectivos elif dentro de la misma condicional. Un elemento nuevo que se incorpora aquí es la condición " " que quiere decir "la variable está vacía", en este caso, cuando no se escribió nada.

CASE-IN ESAC

Herramientas personales