[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Actualización de bRAE.sh (v-0.04)



Actualicé el programita para consultar el diccionario de la RAE desde
consola.

Saludos.

############################################################################
#!/bin/sh

# ###########################################################################
#
# Autor: Miguel Angel Rodríguez (aka timeo)
# Email: asterion@terra.cl || cefeidas@gmail.com.
#
# Versión 0.01: 09 de enero de 2004.
# Versión 0.02: 29 de abril de 2005.
# Versión 0.03: 15 de octubre de 2005.
# Última versión (0.04): 09 de febrero de 2007.
#
# Descripción:
# 	Script para buscar definiciones de términos
# 	en el diccionario de la R.A.E "on line".
#
#	bRAE.sh busca definiciones de términos en la base de datos de la RAE,
#	los muestra en pantalla y guarda una copia comprimida en un directorio
#	creado por el programa para tal efecto. Además posee varias opciones
#	de búsqueda y "limpieza" de archivos de definiciones. La idea base es
#	tener un script para consultar en línea el diccionario de la Real 
# 	Academia de la Lengua y a la vez ir almacenando el resultado de estas 
#	consultas en nuestro disco duro.
#
# Dependencias:
#	Lynx 2.8.X
#	less
#	nmap
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
#
#
# ###########################################################################

# Borramos el fichero de bloqueo al salir.
RM=/bin/rm 
BLOQUEO=${HOME}/.brae.lock
test -x $RM || exit 0
trap "$RM -f $BLOQUEO" 1 3 9 15

# Los insoslayables "caminos".
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
export PATH

# "Localización".
# No usamos LANG="C" porque el script es para trabajar
# exclusivamente con palabras del idioma castellano.
if [[ -z $LANG ]]
then
	LANG="es_ES.ISO-8859-1" 
	export LANG		
fi				

# Nos aseguramos de que esté establecido
# el entorno para que less pueda abrir 
# ficheros comprimidos con gzip.
LESSFILE=/usr/bin/lessfile
test -x $LESSFILE || exit 0
eval "$(lessfile)"

################################################
#
# Algunas constantes para hacernos la vida más
# cómoda.
#
################################################

# Definimos una constante para el nombre del
# programa. (Gracias Aitor Moreno Martínez.)
BASENAME=/usr/bin/basename
test -x $BASENAME || exit 0
PROGRAMA=`$BASENAME $0`

# Definimos la interfaz de red que nos conecta 
# a internet. Poner la que corresponda: pppX,
# ethX, etc..
DISPOSITIVO="ppp0"

# Nombre (URL) del servidor de la RAE.
SERVIDOR="buscon.rae.es"

# Dirección URL del servidor de la base de datos
# de la RAE.
URL="http://buscon.rae.es/draeI/SrvltGUIBusUsual?TIPO_HTML=2&LEMA=";

# Directorio en donde se guardan las archivos 
# de términos encontrados y comprimidos.
BD=${HOME}/DRAE/

# Fichero que se usa para escribir la lista de
# palabras que se desean buscar de una sola vez.
FICHEROPALABRAS=${HOME}/palabrasRAE.txt

# Fichero usado para guardar temporalmente la
# lista de palabras que todavía faltan buscar.
FICHEROPALABRASTMP=${HOME}/palabrasRAE-TMP.txt

# Ficheros de texto usados para crear un
# listado de palabras a partir de un fichero
# cualquiera.
FICHEROTEMP1=${HOME}/listadoPalabras-TMP1.txt
FICHEROTEMP2=${HOME}/listadoPalabras-TMP2.txt

# Fichero que contiene el listado completo de
# palabras del DRAE que existen en el directorio
# del usuario ($HOME/DRAE). 
# Falta poner el listado oficial (${HOME}/listadoPalabrasDRAE-O.txt).
PALABRAS=${HOME}/listadoPalabrasDRAE-U.txt

# Ficheros para guardar temporalmente el resultado
# de una búsqueda.
FICHERODEFTEMP1=${HOME}/fichero_def_temp-TMP1.txt
FICHERODEFTEMP2=${HOME}/fichero_def_temp-TMP2.txt

# Cadena de texto que muestra el servidor de la RAE 
# al pie del artículo.
PIEARTICULO="Real Academia Española © Todos los derechos reservados"

# Cadena de texto que muestra el servidor de la RAE
# al comienzo de cada artículo. Esta característica
# apareció en febrero de 2007. Se la quitamos.
CABECERAARTICULO="Emblema de la Real Academia Española"

# Frase para cuando no se halló el artículo en el servidor
# de la RAE.
NOARTICULO='La palabra consultada no está en el Diccionario.'

# Caracteres especiales excluidos. ¿Falta alguno?
CARESPECIALES="[]ªº\!\|\"\@©·\#\$\%\&\/\(\)\=\?¿\'¡Çç\{\}\*\+\^\_\;\:\.,\<\>\`\\½«»~¬[-]"

# Caracteres especiales, letras mayúsculas, letras mayúsculas con
# diacríticos y números a borrar de un archivo de texto que se 
# va a usar como listado de palabras, cuyos significados se 
# buscarán en el DRAE.
CARESPECIALESBORRAR="\\] - ª º ! | \" @ © · # \\$ % & ( ) \= \? ¿ ' ¡ Ç ç { \\} \* + \\\ \\/ _ ; : , \\. < > \` ½ « » ~ ¬ \^ 0 1 2 3 4 5 6 7 8 9 \\["
MAYUSCULASBORRAR="A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z Á É Í Ó Ú Ä Ë Ï Ö Ü"

# Array de letras minúsculas para reemplazar a sus correspondientes mayúsculas.
MINUSCULAS=(a b c d e f g h i j k l m n ñ o p q r s t u v w x y z á é í ó ú ä ë ï ö ü)

# Número máximo de caracteres que puede tener
# una palabra
let TAMPALABRA=30

# Comandos/programas con sus paths absolutos.
CAT=/bin/cat
CP=/bin/cp
DATE=/bin/date
ECHO=/bin/echo
GREP=/bin/grep
GZIP=/bin/gzip
LS=/bin/ls
MV=/bin/mv
PING=/bin/ping
SED=/bin/sed
ZGREP=/bin/zgrep
IFCONFIG=/sbin/ifconfig
CLEAR=/usr/bin/clear
CUT=/usr/bin/cut
FILE=/usr/bin/file
FIND=/usr/bin/find
HEAD=/usr/bin/head
LESS=/usr/bin/less
LYNX=/usr/bin/lynx
NMAP=/usr/bin/nmap
TAIL=/usr/bin/tail
STAT=/usr/bin/stat
TOUCH=/usr/bin/touch
WC=/usr/bin/wc

# Creamos una función de error para:
# 1. Indicar cuál es el programa o comando que no existe;
# 2  Indicar que una cadena de entrada es errónea; y
# 3. Indicar el fallo en la ejecución de un programa.
test -x $ECHO || exit 0
FALLOS=(1 2 3)
mensaje_error() {

	M_CADENA=$1
	M_OPCION=$2

	if [[ $M_OPCION = ${FALLOS[0]} ]]
	then	
		$ECHO -e "\nNo existe «$M_CADENA».\n"
	elif [[ $M_OPCION = ${FALLOS[1]} ]]
	then
		$ECHO -e "\nUse parámetro «$M_CADENA».\n"
	elif [[ $M_OPCION = ${FALLOS[2]} ]]
	then
		$ECHO -e "\nFallo en la ejecución de «$M_CADENA».\n"
	else
		$ECHO -e "\nError en función «mensaje_error».\n"
	fi

	$RM -f $BLOQUEO
	exit 0
}

# Comprobamos que existen todos los comandos/programas
# que usaremos en nuestro script.
test -x $CAT || mensaje_error "cat-1" "1"
test -x $CP || mensaje_error "cp-1" "1"
test -x $DATE || mensaje_error "date-1" "1"
test -x $GREP || mensaje_error "grep-1" "1"
test -x $GZIP || mensaje_error "gzip-1" "1"
test -x $LS || mensaje_error "ls-1" "1"
test -x $MV || mensaje_error "mv-1" "1"
test -x $PING || mensaje_error "ping-1" "1"
test -x $SED || mensaje_error "sed-1" "1"
test -x $ZGREP || mensaje_error "zgrep-1" "1"
test -x $IFCONFIG || mensaje_error "ifconfig-1" "1"
test -x $CLEAR || mensaje_error "clear-1" "1"
test -x $CUT || mensaje_error "cut-1" "1"
test -x $FILE || mensaje_error "file-1" "1"
test -x $FIND || mensaje_error "find-1" "1"
test -x $HEAD || mensaje_error "head-1" "1"
test -x $LESS || mensaje_error "less-1" "1"
test -x $LYNX || mensaje_error "lynx-1" "1"
test -x $NMAP || mensaje_error "nmap-1" "1"
test -x $STAT || mensaje_error "stat-1" "1"
test -x $TAIL || mensaje_error "tail-1" "1"
test -x $TOUCH || mensaje_error "touch-1" "1"
test -x $WC || mensaje_error "wc-1" "1"

################################################
#
# Requisitos para correr el programa:
# 1. No ejecutarse con permisos de root.
# 2. Existir el directorio /home/.
# 3. No haber otro proceso bRAE.sh.
#
################################################

# Primeramente comprobamos que el programa
# no se ejecutará con permisos de superusuario.
# Esto no es Windows ;).
if [[ `id -u` -lt 1000 ]]
then
	$ECHO -e "\nNo puede tener permisos de superusuario \
para ejecutar este programa.\n"
	exit 1
fi

# Luego comprobamos si existe el directorio $HOME.
DIR_HOME="$HOME"
if [[ ! -d $DIR_HOME ]]
then
	$ECHO -e "\nNo existe el directorio $DIR_HOME.\n"
	exit 0
fi

# Nos cercioramos de que no se esté ejecutando
# un proceso "bRAE.sh". Para ello creamos un 
# rudimentario fichero de bloqueo 
# ($HOME/.brae.lock).
if [[ -s $BLOQUEO ]]
then
	$ECHO -e "\nTiene otro proceso \"bRAE.sh\" en memoria.\n"
	exit 1 
else
	$ECHO "1" > $BLOQUEO
fi

################################################
#
# Funciones para escribir menos y ocupar menos
# espacio ;-).
#
################################################

buscar_borrar_ficheros() {

#	Para determinar cuáles ficheros no contienen definiciones
#	medimos su extensión (100 b), constatamos la existencia
#	-o no- de dos cadenas de texto especiales y, por último,
#	comprobamos el tipo de fichero (si es comprimido o no).
#	Síntesis: comprobamos tamaño (stat), contenido (zgrep)
#	y formato (file).

	B_FICHERO=$1
	B_OPCION=$2

	nom_fichero=`$ECHO $B_FICHERO | $CUT -c 6- | $CUT -f2 -dE | $CUT -c 2- | $CUT -f1 -d.`

	if [[ `$STAT -c %s $B_FICHERO` -le 100 || -n `$ZGREP 'La palabra '\"$nom_fichero\"' \
no está en el Diccionario.' $B_FICHERO` || -n `$ZGREP 'The requested URL could not be retrieved' $B_FICHERO` \
|| -z `$FILE -b $B_FICHERO | $GREP -s  'gzip compressed data'` ]]
	then
		case "$B_OPCION" in
			"0")
			let numero=numero+1
			$ECHO -e "\nBorrando ficheros vacíos... $B_FICHERO [$numero]\n"
			$RM -f $B_FICHERO || mensaje_error "rm-1" "3"
			;;

			"1")
			let numero=numero+1
			$ECHO -e "\nMostrando ficheros vacíos... $B_FICHERO [$numero]\n"
			;;
		esac
	fi
}

crear_listado_palabras() {

C_FICHERO=$1

# Comprobamos la entrada para fichero.
if [[ ! -f $C_FICHERO ]]
then
#	¿Existe el fichero?
	$ECHO -e "\nFichero \"$C_FICHERO\" no existe.\n"
	$RM -f $BLOQUEO || mensaje_error "rm-2" "3"
	exit 1
elif [[ ! `$FILE -b $C_FICHERO | $GREP -s 'text'` ]]
then
#	¿Es un fichero de texto?
	$ECHO -e "\nNo es un fichero de texto.\n"
	$RM -f $BLOQUEO
	exit 1
else
#	Ok.
#	Si se trata de un fichero html efectuamos un 
#	volcado de la salida del navegador, para evitar
#	copiar las etiquetas del lenguaje html para
#	caracteres especiales (acute, tilde, etc.).
	if [[ `$FILE -b $C_FICHERO | $GREP -s 'HTML'` || `$FILE -b $C_FICHERO | $GREP -s 'SGML'` ]]
	then
		$LYNX -dump -nolist $C_FICHERO > $FICHEROTEMP2 || mensaje_error "lynx-2" "3"

#	Suprimimos las líneas en blanco.
		$SED /^$/d $FICHEROTEMP2 > $FICHEROTEMP1 || mensaje_error "sed-2" "3"
	else
		$SED /^$/d $C_FICHERO > $FICHEROTEMP1 || mensaje_error "sed-3" "3"
	fi

	$ECHO -e "\nCreando listado de palabras a buscar...\n"
fi

# Reemplazamos caracteres especiales por espacios en blanco.
for caracterespecial in $CARESPECIALESBORRAR
do
	$SED s/$caracterespecial/\ /g $FICHEROTEMP1 > $FICHEROTEMP2 || mensaje_error "sed-4" "3"
	$CP $FICHEROTEMP2 $FICHEROTEMP1 || mensaje_error "cp-2" "3"
done

# Reemplazamos letras mayúsculas por sus correspondientes minúsculas.
let letra=0
for caractermayuscula in $MAYUSCULASBORRAR
do
	$SED s/$caractermayuscula/${MINUSCULAS[letra++]}/g $FICHEROTEMP1 > $FICHEROTEMP2 || mensaje_error "sed-5" "3"
	$CP $FICHEROTEMP2 $FICHEROTEMP1 || mensaje_error "cp-3" "3"
done

# Creamos el fichero "palabrasRAE.txt".
$CP $FICHEROTEMP1 $FICHEROPALABRAS || mensaje_error "cp-4" "3"
# Borramos los ficheros temporales.
$RM -f $FICHEROTEMP1 $FICHEROTEMP2 || mensaje_error "rm-3" "3"

}

# Los nombres de las funciones explican lo que hace
# cada una de ellas. ¿O no?
comprobar_fichero() {

	if [[ -s $FICHEROPALABRAS ]]
	then
		palabras=`$CAT $FICHEROPALABRAS`
	else
		$ECHO -e "\nNo existe fichero de palabras a buscar, o está vacío.\n"
		$RM -f $BLOQUEO || mensaje_error "rm-4" "3"
		exit 0
	fi
}

comprobar_fichero_2() {

	CO_FICHERO=$1

	if [[ ! -f $CO_FICHERO ]]
	then
		$TOUCH $CO_FICHERO || mensaje_error "touch-2" "3"
	fi
}

comprobar_directorio() {

	if [[ ! -d $BD ]]
	then
		mkdir $BD || mensaje_error "mkdir" "3"
	fi	
}

comprobar_entradas() {

#	Comprobamos si los caracteres introducidos son
#	válidos. No aceptamos mayúsculas ni dígitos
#	ni caracteres especiales.

	COM_ENTRADA=$1
	COM_PATRON=$2
	COM_OPCION=$3

	case "$COM_OPCION" in
		"0")
		comando="$CAT"
		;;

		"1")
		comando="echo"
		;;
	esac

	if [[ `$comando $COM_ENTRADA | $GREP [[:upper:]]` \
|| `$comando $COM_ENTRADA | $GREP [[:digit:]]` \
|| `$comando $COM_ENTRADA | $GREP -e $COM_PATRON` \
|| (! -e $COM_ENTRADA && `$comando $COM_ENTRADA | $WC -m` -gt $TAMPALABRA) ]]
	then
		$ECHO -e "\nIntroduzca una cadena válida. Debe estar compuesta sólo\n\
de letras minúsculas y tener menos de $TAMPALABRA caracteres.\n"
		$RM -f $BLOQUEO || mensaje_error "rm-5" "3"
		exit 0
	fi

#	Comprobamos la longitud de las palabras del fichero,
#	pues en el anterior if no lo habíamos hecho.
	if [[ $COM_ENTRADA = $FICHEROPALABRAS ]]
	then
		for palabra_fichero in `$comando $COM_ENTRADA`
		do
			if [[ `$ECHO $palabra_fichero | $WC -m` -gt $TAMPALABRA ]]
			then
				$ECHO -e "\nPalabra demasiado larga.\n"
				$RM -f $BLOQUEO || mensaje_error "rm-6" "3"
				exit 1
			fi
		done
	fi
}

comprobar_conexion() {

#	Usamos triple comprobación por si es el caso
#	de una máquina parte de una LAN con IP MASQUERADE
#	y con un cortafuegos que filtra el puerto 7.
#	Es preciso tener nmap instalado :-(.
#
#	1. ifconfig,
#	2. ping,
#	3. nmap.

	COMP_OPCION=$1

	if [[ -z `$IFCONFIG $DISPOSITIVO 2> /dev/null | $GREP 'inet addr:' | $CUT -f2 -d: | $CUT -f1 -dP` ]]
	then
		if [[ -z `$PING -c 1 $SERVIDOR 2> /dev/null | $GREP 'from' | $CUT -f2 -dm  | $CUT -f1 -d:` ]]
		then
			if [[ `$NMAP -sP buscon.rae.es 2> /dev/null | $GREP 'Nmap run completed' | $CUT -c 23` == 0 ]]
			then
				case "$COMP_OPCION" in
					"0")
#					Opción sólo usada con el parámetro "-a".
					$ECHO -e "\nNo existe conexión a Internet.\n"
					$RM -f $BLOQUEO || mensaje_error "rm-7" "3"
					exit 0
					;;

					"1")
					conexion=0
					;;
				esac
			fi
		fi
	fi
}

buscar_definicion() {

#	Buscamos la definición del término y el
#	resultado de la búsqueda lo convertimos
#	en texto plano y lo guardamos en una 
#	variable. Comprobamos su contenido. Si 
#	es una definición válida lo guardamos 
#	en un fichero comprimido en el directorio
#	$HOME/DRAE/.

	B_TERMINO=$1
	B_NUMERO=$2
	B_OPCION=$3

	$ECHO -e "\nBuscando definición de «$B_TERMINO»... $B_NUMERO"
	def_temp=`$LYNX -dump -nolist ${URL}${B_TERMINO}` || mensaje_error "lynx-3" "3"

	if [[ -z `$ECHO "$def_temp" | $GREP -Fs "$PIEARTICULO"` ]]
	then
		$ECHO -e "\n$NOARTICULO\n"
		case $B_OPCION in
			"0")
			$RM -f $BLOQUEO || mensaje_error "rm-8" "3"
			exit 0
			;;

			"1")
#	!El poder de sed!... y el enorme consumo de ciclos de reloj para
#	hacer una "virguería" en un ficherito. :->
#	Este es un HACK, y de los peores.
			$SED s/$B_TERMINO//g $FICHEROPALABRAS > $FICHEROPALABRASTMP || mensaje_error "sed-6" "3"
			$SED '/^$/d' $FICHEROPALABRASTMP > $FICHEROPALABRAS || mensaje_error "sed-7" "3"
			$RM -f $FICHEROPALABRASTMP || mensaje_error "rm-9" "3"
			let fallos=fallos+1
			return
			;;
		esac
	fi

#	Última comprobación: nos cercioramos de que el nombre 
#	del artículo buscado se corresponda con su definición.
#	A veces (poquísimas), con el parámetro "-a", el servidor 
#	de la RAE devuelve alguna "incoherencia".
	if [[ -n `$ECHO "$def_temp" | $HEAD -7 | $TAIL -2 | $GREP -s "$B_TERMINO"` ]]
	then
		# Guardamos la definición encontrada en un fichero temporal.
		$ECHO "$def_temp" > $FICHERODEFTEMP1
		# Le quitamos al texto de la definición la cabecera de la RAE.
		$SED s/"$CABECERAARTICULO"// $FICHERODEFTEMP1 > $FICHERODEFTEMP2 || mensaje_error "sed-8" "3"
		# Le quitamos al texto de la definición las líneas en blanco.
		$SED /^$/d $FICHERODEFTEMP2 > ${BD}${B_TERMINO} || mensaje_error "sed-9" "3"
		# Guardamos la definición en un fichero comprimido, en su directorio.
		$GZIP -9 -f ${BD}${B_TERMINO} || mensaje_error "gzip-2" "3"
		# Borramos los dos ficheros temporales que habíamos creado.
		$RM -f $FICHERODEFTEMP1 || mensaje_error "rm-10" "3"
		$RM -f $FICHERODEFTEMP2 || mensaje_error "rm-11" "3"
	else
		$ECHO -e "\nError en el servidor de la RAE: `$ECHO "$def_temp" \
| $HEAD -2 | $SED /^$/d` != $B_TERMINO.\n"
		$RM -f $BLOQUEO || mensaje_error "rm-12" "3"
		exit 1
	fi
}

################################################
#
# Comienza el programa... o las opciones.
#
################################################

$CAT << EOF

$PROGRAMA
EOF

if [[ ! $# -ge 1 ]]
then
	$ECHO -e "\nIntroduzca un vocablo. O use el parámetro -m.\n"
	$RM -f $BLOQUEO || mensaje_error "rm-13" "3"
	exit 0

################################################
#
# Buscamos la definición de una serie de
# palabras que se encuentran en un fichero 
# ($HOME/palabrasRAE.txt).
# Tenemos la opción de ver o no la definición de
# cada una de ellas mediante el parámetro [-t].
#
################################################ 

elif [[ $1 = "-a" ]]
then

#	Averiguamos si estamos conectados a Internet.
	comprobar_conexion "0"

#	Comprobamos la existencia del fichero de palabras
#	y, si existe, pasamos su contenido a la variable
#	$palabras.
	comprobar_fichero

#	Probamos la validez de los caracteres introducidos.
	comprobar_entradas "$FICHEROPALABRAS" "$CARESPECIALES" "0"

#	Buscamos las palabras, primero en nuestro disco duro.
#	Si no se encuentran aquí, buscamos en el servidor de la RAE.
	let numero=0
	for termino in $palabras
	do
		if [[ -s ${BD}${termino}.gz ]]
		then
			case "$2" in
				"")
				$ECHO -e "\nCaché...\n" 
				;;

				"-t")
				$LESS -sSC -~ ${BD}${termino}.gz || mensaje_error "less-2" "3"
				;;

				*)
				mensaje_error "-t" "2"
				;;
			esac
		else
			comprobar_directorio

			let numero=numero+1
			case "$2" in
				"")
				buscar_definicion "$termino" "$numero" "1"
				;;

				"-t")
				buscar_definicion "$termino" "$numero" "1"
				$LESS -sSC -~ ${BD}${termino}.gz || mensaje_error "less-3" "3"
				;;

				*)
				mensaje_error "-t" "2"
				;;
			esac
		fi
	done

	let cero=0
	resultado=${fallos:=$cero}
	encontradas=`expr $numero - $resultado` # Variable $fallos viene de función
	$CLEAR                                   # buscar_definición().
	$ECHO -e "\n$numero palabras buscadas en el servidor.\n
	$encontradas definiciones halladas.\n
	$resultado no encontradas.\n"

	# Creamos o actualizamos el listado de palabras
	# que tenemos en el directorio $HOME/DRAE.
	cd $BD
	$LS -1 | $GREP -s '.gz' | $CUT -d '.' -f 1 > $PALABRAS || mensaje_error "ls-2" "3"
	cd
	

################################################
#
# Buscamos la definición de una  palabras que 
# ya se encuentra en nuestro directorio, y la
# sobrescribimos. Sirve para actualizar. 
#
################################################ 

elif [[ $1 = "-r" ]]
then
	
	if [[ -z $2 ]]
	then
		$ECHO -e "\nIntroduzca la palabra que desea actualizar.\n"
		$RM -f $BLOQUEO || mensaje_error "rm-14" "3"
		exit 0
	fi

	comprobar_entradas "$2" "$CARESPECIALES" "1"

#	Comprobamos si estamos conectados a Internet.
#	El resultado lo alojamos en la variable $conexion.
	comprobar_conexion "1"

	if [[ -s ${BD}${2}.gz ]]
	then
		if [[ $conexion = "0" ]]
		then
			$ECHO -e "\nNo existe conexión a Internet.\n"
			$RM -f $BLOQUEO || mensaje_error "rm-15" "3"
			exit 0
		else
			comprobar_directorio
			buscar_definicion "$2" "(actualización)" "0"
			$LESS -sSC -~ ${BD}${2}.gz || mensaje_error "less-4" "3"
			$CLEAR
		fi
	else
		$ECHO -e "\nLa palabra que intenta actualizar («$2») no está en su directorio.\n"
		$RM -f $BLOQUEO || mensaje_error "rm-16" "3"
		exit 0 
	fi

################################################
#
# Creamos el fichero de palabras a buscar a 
# partir de cualquier fichero de texto.
#
################################################

elif [[ $1 = "-f" ]]
then

	crear_listado_palabras "$2"
	
################################################
#
# Borramos los archivos generados por búsquedas
# fallidas. 
#
# - Con el parámetro [-b] sin nada más, buscamos 
# y borramos todos los ficheros comprimidos
# (*.gz).
# - Con el parámetro opcional [-t] buscamos
# todos los ficheros vacíos, y los borramos. 
# - Con el parámetro opcional [-h] buscamos y
# borramos los ficheros comprimidos de hoy.
# - Con el parámetro opcional [-th] borramos 
# todos los ficheros (comprimidos o no) de hoy. 
#
# Las opciones [-b] y [-b -t] pueden llegar a
# ser extremadamente lentas.
#
################################################ 

elif [[ $1 = "-b" ]]
then

	$ECHO -e "\nBuscando ficheros vacíos..."

	for ficheros in ${BD}*
	do
		case "$2" in
			"")
			if [[ `$FIND $ficheros -daystart -name '*.gz' -print` ]]
			then
				buscar_borrar_ficheros "$ficheros" "0"
			fi
			;;

			-t)
			buscar_borrar_ficheros "$ficheros" "0"
			;;

			-h)
			if [[ `$FIND $ficheros -daystart -name '*.gz' -ctime -1 -print` ]]
			then
				buscar_borrar_ficheros "$ficheros" "0"
			fi
			;;

			-th)
			if [[ `$FIND $ficheros -daystart -name '*' -ctime -1 -print` ]]
			then
				buscar_borrar_ficheros "$ficheros" "0"
			fi
			;;

			*)
			mensaje_error "-t, -h, o -th" "2"
			;;
		esac
	done

	if [[ $numero -gt 0 ]]
	then
		$CLEAR
		$ECHO -e "\n$numero entradas borradas."
		$RM -f $BLOQUEO || mensaje_error "rm-17" "3"
		exit 0
	else
		$ECHO -e "\nNo encontré ficheros para borrar. I'sorry... :-)\n"
		$RM -f $BLOQUEO || mensaje_error "rm-18" "3"
		exit 0
	fi

################################################
#
# Buscamos los archivos generados por búsquedas
# fallidas. Igual que con el parámetro [-b] pero
# sin borrar nada.
#
# - Con el parámetro [-v] sin nada más, buscamos
# todos los ficheros comprimidos (*.gz).
# - Con el parámetro opcional [-t] buscamos la
# totalidad de los ficheros vacíos.
# - Con el parámetro opcional [-h] buscamos sólo
# los ficheros comprimidos (*.gz) de hoy.
# - Con el parámetro opcional [-th] buscamos la
# totalidad de los ficheros vacíos de hoy.
#
# Las opciones [-v] y [-v -t] pueden llegar a
# ser extremadamente lentas.
#
# Opción para curiosos 8-).
#
################################################ 

elif [[ $1 = "-v" ]]
then
	$ECHO -e "\nBuscando ficheros vacíos..."

	for ficheros in ${BD}*
	do
		case "$2" in
			"")
			if [[ `$FIND $ficheros -daystart -name '*.gz' -print` ]]
			then
				buscar_borrar_ficheros "$ficheros" "1"
			fi
			;;

			-t)
			buscar_borrar_ficheros "$ficheros" "1"
			;;

			-h)
			if [[ `$FIND $ficheros -daystart -name '*.gz' -ctime -1 -print` ]]
			then
				buscar_borrar_ficheros "$ficheros" "1"
			fi
			;;

			-th)
			if [[ `$FIND $ficheros -daystart -name '*' -ctime -1 -print` ]]
			then
				buscar_borrar_ficheros "$ficheros" "1"
			fi
			;;

			*)
			mensaje_error "-t, -h, o -th" "2"
			;;
		esac	
	done

	if [[ $numero -gt 0 ]]
	then
		$CLEAR
		$ECHO -e "\nEncontré $numero ficheros vacíos. ¿Muchos?\n"
		$RM -f $BLOQUEO || mensaje_error "rm-19" "3"
		exit 0
	else
		$ECHO -e "\nNo encontré ficheros vacíos. I'sorry... :-)\n"
		$RM -f $BLOQUEO || mensaje_error "rm-20" "3"
		exit 0
	fi

################################################
#
# Opción para mostrarnos el número total de
# entradas en el directorio del diccionario.
#
# - Con el parámetro [-n] sin nada más, nos
# muestra la totalidad de entradas comprimidas
# (*.gz).
# - Con el parámetro opcional [-t] nos muestra
# el número total de entradas.
# - Con el parámetro opcional [-h] nos muestra
# el número de ficheros comprimidos de hoy.
# - Con el parámetro opcional [-th] nos muestra
# el número total de ficheros de hoy.
#
# Otra opción para curiosos.
#
################################################ 

elif [[ $1 = "-n" ]]
then
	case "$2" in
		"")
		cantidad=`$FIND $BD -mindepth 1 -name '*.gz' -print | $WC -l`
		$ECHO -e "\nHay $cantidad palabras en el diccionario.\n"
		;;

		-t)
		cantidad_total=`$FIND $BD -mindepth 1 -name '*' -print | $WC -l`
		$ECHO -e "\nHay $cantidad_total palabras en el diccionario (total).\n"
		;;

		-h)
		fecha=`$DATE +%d-%m-%y`
		cantidad_hoy=`$FIND $BD -mindepth 1 -daystart -name '*.gz' -ctime -1 -print | $WC -l`
		$ECHO -e "\nHay $cantidad_hoy palabras en el diccionario (hoy: $fecha).\n"
		;;

		-th)
		fecha=`$DATE +%d-%m-%y`
		cantidad_total_hoy=`$FIND $BD -mindepth 1 -daystart -name '*' -ctime -1 -print | $WC -l`
		$ECHO -e "\nHay $cantidad_total_hoy palabras en el diccionario (total hoy: $fecha).\n"
		;;

		*)
		mensaje_error "-t, -h, o -th" "2"
		;;
	esac

################################################
#
# Limpiamos el archivo $HOME/palabrasRAE.txt.
# Sólo dejamos las palabras cuya definición aún
# debemos hallar.
#
################################################ 

elif [[ $1 = "-l" ]]
then

#	Pasamos el contenido del fichero a la
#	variable $palabras
	comprobar_fichero
	comprobar_fichero_2 "$FICHEROPALABRASTMP"

	let numero=0

	for termino in $palabras
	do
		if [[ ! -s ${BD}${termino}.gz ]]
		then
			$ECHO -e $termino >> $FICHEROPALABRASTMP
			let numero=numero+1
		fi
	done

	$MV $FICHEROPALABRASTMP $FICHEROPALABRAS || mensaje_error "mv-2" "3"

	$ECHO -e "\n$numero palabras guardadas.\n"

################################################
#
# Menú para no olvidarnos del uso para el cual
# fue hecho este script :-).
#
################################################ 

elif [[ $1 = "-m" ]]
then
espacio=`$ECHO -e "\t\t"`
	declare -a MENU

	MENU=(
		"Busca definiciones en el DRAE \"on line\"."
		"Versión: 0.04"
		"Autor: Miguel Angel Rodríguez"
		""
		"-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"
		"Licencia: Este programa es software libre. Vea el código fuente"
		"para las condiciones de copia. No hay NINGUNA GARANTÍA;"
		"ni siquiera la que implique garantía de COMERCIABILIDAD"
		"o IDONEIDAD PARA UN FIN DETERMINADO."
		"-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"
		""
		"Modo de uso:" 
		"-----------  bRAE.sh [PALABRA] busca definición de [PALABRA]."
		""
		"[-r] [palabra] -> busca definiciones ya encontradas y las sobrescribe."
		"[-a] -----------> busca definiciones de palabras desde un fichero especial."
		"[-a] [-t] ------> ídem anterior pero mostrando cada una de las definiciones."
		"[-f] [FICHERO] -> crea fichero especial a partir de un fichero cualquiera."
		""
		"[-b] -----------> busca y borra las entradas vacías con extensión <*.gz>."
		"[-b] [-t] ------> busca y borra todas las entradas vacías."
		"[-b] [-h] ------> busca y borra las entradas vacías con extensión <*.gz> de hoy."
		"[-b] [-th] -----> busca y borra todas las entradas vacías de hoy."
		""
		"[-v] -----------> busca los ficheros vacíos con extensión <*.gz>."
		"[-v] [-t] ------> busca todos los ficheros vacíos."
		"[-v] [-h] ------> busca los ficheros vacíos con extensión <*.gz> de hoy."
		"[-v] [-th] -----> busca todos los ficheros vacíos de hoy."
		""
		"[-n] -----------> muestra cantidad de ficheros con extensión <*.gz>."
		"[-n] [-t] ------> muestra total de ficheros."
		"[-n] [-h] ------> muestra la cantidad de ficheros con extensión <*.gz> de hoy."
		"[-n] [-th] -----> muestra el total de ficheros de hoy."
		""
		"[-l] -----------> limpia el fichero de palabras encontradas." 
		""
		"[-m] -----------> este menú."
		""
		"Comunicar bugs y modificaciones a <asterion@terra.cl>."
		""
	)

	let numero=0
	while [ $numero -lt 40 ]
	do
		$ECHO ${MENU[numero++]}
	done

################################################
#
# Buscamos la definición de una palabra mediante
# una consulta al servidor de la RAE.
#
################################################ 

else
	comprobar_entradas "$1" "$CARESPECIALES" "1"

#	Comprobamos si estamos conectados a Internet.
#	El resultado lo alojamos en la variable $conexion.
	comprobar_conexion "1"

	if [[ -s ${BD}${1}.gz ]]
	then
		$ECHO -e "\nCaché...\n"
		$LESS -sSC -~ ${BD}${1}.gz || mensaje_error "less-5" "3"
	elif [[ $conexion = "0" ]]
	then
		$ECHO -e "\nNo existe conexión a Internet.\n"
		comprobar_fichero_2 "$FICHEROPALABRAS"
		if [[ ! `$GREP -w $1 $FICHEROPALABRAS` ]]
		then
			$ECHO -e "Palabra guardada para su posterior búsqueda.\n"
			$ECHO "$1" >> $FICHEROPALABRAS 
		else
			$ECHO -e "Esta palabra ya fue guardada para su posterior búsqueda.\n"
		fi
		$RM -f $BLOQUEO || mensaje_error "rm-21" "3"
		exit 0
	else
		comprobar_directorio
		buscar_definicion "$1" "" "0"
		$LESS -sSC -~ ${BD}${1}.gz || mensaje_error "less-6" "3"
		$CLEAR
	fi
fi

# Salida del programa.
if [[ $? = 0 ]]
then
	$ECHO "."
	$RM -f $BLOQUEO || mensaje_error "rm-22" "3"
	exit 0
else
	$ECHO -e "\n ${PROGRAMA}: El programa terminó con error.\n"
	$RM -f $BLOQUEO || mensaje_error "rm-23" "3"
	exit 1
fi

# -=-= fin de bRAE.sh =-=-

# Para escribir este shellscript se usó
# VIM - Vi IMproved 7.0 (2006 May 7, compiled Oct 10 2006 00:48:23)
############################################################################

-- 
Miguel Ángel Rodríguez
mailto:cepheidas@gmail.com
http://www.cefeidas.homelinux.org
Linux User Registered #65964
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Para obtener mi clave pública escríbeme un email
con el Subject: enviar clave publica
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

The effort to understand the universe is one of the very few things
that lifts human life a little above the level of farce, and gives
it some of the grace of tragedy.

                        (Steven Weinberg, The First Three Minutes)



Reply to: