Editando vídeo Poseía Poesía

Este es uno de los fotogramas palimpsésticos del vídeo que he preparado para la Presentación de Poseía Poesía.

Lo he estado editando con Kdenlive, que es, con suma diferencia, muchísimo mejor que Openshot con el que hasta ahora había editado vídeo sobre Linux, lo que no deja de ser una locura antisistema mayor que la de pegarse con adhesivo a una obra de arte mercadeada.

El problema de las cookies

Mi amiga Carla Vigara, gran humorista del mundo mundial, en absoluto gilipollas a pesar de su insistencia, ha publicado el otro día este texto sobre las cookies en una red social:

Hoy, en «Los problemas del primer mundo», vengo a comentar mi indignación ante las famosas cookies. Esos textos que aparecen en sitios web y que están ahí para que dichos sitios registren información sobre ti, para venderte hasta a tu madre y que vuelvas repetidamente a estos mismos sitios.

Mi política de cookies había sido aceptar todo y a correr. Hasta hace poco. Que me dio por rechazar todo y a correr. O rechazar hasta donde me dejan rechazar, porque hay unas «cookies necesarias» que te las vas a comer sí o sí. Quizá por eso las llamaron «cookies». PORQUE TE LAS COMES.

Total. Que mi indignación viene de que, como en tantas otras cosas, utilizan la política del hastío, del hartazgo, de la desesperación. Porque tú rechazas. Y rechazas. Y esta no y esta tampoco. Todo no, menos las «necesarias». Pero si vuelves ahí, sorpresa: tienes que volver a rechazarlo todo otra vez. De una en una. Ninguno de estos sitios web guarda, pese a haberle dado a un botón que pone «guardar y cerrar» y pese a que estás accediendo desde el mismo dispositivo, tu configuración de «idos, por favor, a freír espárragos».

Curiosamente, sí guardan la configuración si lo aceptas todo. Te comes TODAS las cookies y engordas para morir cayendo en la manipulación, que es lo que harán con «el registro» de tu visita.

De momento me coge con ganas así que voy a seguir rechazando. Dijo ella, mientras publicaba en una red social.

A lo que un amigo le ha respondido cordialmente, con información bastante acertada:

Un sitio web no puede guardar que has rechazado las cookies si no se lo permites… No es una trampa. Es que no puede.

Mi amiga, que es mucho menos ignorante de lo que ella afirma, le pregunta o comenta lo siguiente:

Soy una ignorante en esta como en tantas otras cosas, pero si tú guardas la configuración de las que aceptas y las que rechazas porque hay un botón para ello, ¿qué es? ¿Guardar para este ratito y no preguntarte en dos minutos otra vez si no sales de aquí? No entiendo que exista este botón si no vas a guardar, efectivamente, las preferencias de cookies. Pero insisto. Ni pajolera idea.

No he podido por menos que lanzarme a responder hablándole de cómo funcionan las cookies, ese pequeño engendro del «demoño», con el que nos controlan, haciendo no veladas referencias a mi querida película de Amanece que no es poco, que tanto ella como yo veneramos:

Como dice tu amigo, para que un sitio web guarde tu decisión sobre las cookies o cualquier otra información, ha de usar cookies, pero como le has dicho que no guarde cookies, pues no puede guardar tu decisión sobre las cookies, así que te seguirá preguntando en un bucle divertido e infinito si quieres que guarde tu decisión sobre las cookies, pero la única forma que tiene de hacerte caso por siempre jamás es que aceptes las cookies, información que la web guardará en una cookie (en tu dispositivo, por otro lado, así que no lo guarda, lo guardas tú), pero por otro lado, el hecho de una web que te pregunte si quieres que guarde tu decisión sobre las cookies en realidad te dice que no tiene ni idea de qué hacer, lo que viene a significar que no tiene una cookie tuya (o suya) que le diga nada, o sea, que es la mejor señal de las posibles. Pero todo esto es mucho más divertido de lo que puedo llegar a explicar. ¿Acaso hay cookies de chocolate? ¿de jengibre? ¿Por qué las cookies se llaman cookies, es porque te las comes, como tú crees o es porque te las dan, a modo de «hostias» más o menos consagradas? ¿En qué idioma hablan las cookies? ¿Tienen pelo las cookies? ¿envejencen las cookies? ¿Les duele algo? El honor de las cookies, la pauta completa de cookies… ay… ¿Son las cookies las nuevas ingles? … [Por favor, déjame usar tu texto y mi respuesta para un viejo proyecto cuyo reinicio ha despertado]

Y ahora estoy deseando lanzarme a terminar ese proyecto de cookies, una aplicación web que ofrezca una y otra vez aceptar todas las cookies de todas las web del mundo mundial y que no pueda hacerlo, lo diga, pero insista, en un bucle infinito de aceptación de todas las cookies de las web del mundo mundial, en realidad, en un ejercicio de sumisión absoluta y absolutamente imposible.

Otro de esos proyectos absurdos de poesía programable que tanto me divierten.

2022

Hasta el año 2200 no vuelve a haber un año compuesto únicamente con doses y ceros. Al menos en este arbitrario calendario.

He realizado un pequeño script que escribe los años que vamos a pasar en sequía de una condición tan arbitraria como cualquier otra:

#!/bin/bash

for ((i=2022; i<=2200; i+=2)); do
echo $(printf "%03d " "$i")
done

y el resultado, después de sustituir los finales de línea por barras, para unirlos en una sola línea es:

2022/ 2024/ 2026/ 2028/ 2030/ 2032/ 2034/ 2036/ 2038/ 2040/ 2042/ 2044/ 2046/ 2048/ 2050/ 2052/ 2054/ 2056/ 2058/ 2060/ 2062/ 2064/ 2066/ 2068/ 2070/ 2072/ 2074/ 2076/ 2078/ 2080/ 2082/ 2084/ 2086/ 2088/ 2090/ 2092/ 2094/ 2096/ 2098/ 2100/ 2102/ 2104/ 2106/ 2108/ 2110/ 2112/ 2114/ 2116/ 2118/ 2120/ 2122/ 2124/ 2126/ 2128/ 2130/ 2132/ 2134/ 2136/ 2138/ 2140/ 2142/ 2144/ 2146/ 2148/ 2150/ 2152/ 2154/ 2156/ 2158/ 2160/ 2162/ 2164/ 2166/ 2168/ 2170/ 2172/ 2174/ 2176/ 2178/ 2180/ 2182/ 2184/ 2186/ 2188/ 2190/ 2192/ 2194/ 2196/ 2198/ 2200/

Como puede verse, me ahorré los impares, pues obviamente no están formados únicamente por dígitos ceros y doses. Era por ahorrar… 😉

uno imagina irracionales…

Uno imagina cuando encuentra por primera vez números a los que llama irracionales que no lo son en el sentido que ha imaginado, sino en el hecho de que no son razones, razones entre números enteros, pero tampoco uno cae en la cuenta de que a las divisiones les llamamos razones, así, sin ton ni son o todo lo contrario, quizá no hay nada más razonable que dividir las cosas, repartirlas, incluso los números enteros para que dejen de ser tan pretenciosamente enteros y cuando uno se encuentra números que no son el fruto de una repartición siente cierta aversión hacia ellos, los repudia, los niega, los ningunea, uno intenta convencerse de que son aproximaciones de algo más «razonable», aunque uno llegue a saber que no es así por reducción al absurdo, que parece una reducción al Pedro Ximénez, pero no tiene nada que ver con ella, por muy sabrosa que pueda resultar en ocasiones.

Uno imagina cuando encuentra por primera vez números a los que llama irracionales que no son todos iguales y que el loco paralelismo prestado por el léxico filosófico sirve para clasificarlos en trascendentes, construibles, algebraicos, normales… Sí, también uno descubre que hay números normales y lo que a uno le vuelve aún más loco (que no irracional) es que todo número normal debe ser necesariamente irracional, así, como si nada, como si eso de repente explicase tantas cosas que uno nunca ha comprendido en la vida que parece una epifanía.

Uno imagina cuando encuentra por primera vez números a los que llama irracionales que no son el final de todos los números posibles y que ha de haber algo más allá, así que se emociona incluso cuando a uno le hablan de los números imaginarios que hacen realidad el hecho de que los números reales no sean tan completos como creían ser, mientras sí lo serán los números complejos, así: completos sin complejos.

Uno imagina (pues no puede parar de imaginar) cuando encuentra por primera vez números a los que llama irracionales que no son más que la puerta de entrada a la matemática de la poesía, la que descubrirá un número poético que incluirá sus números imaginarios, sus irracionales, sus enteros y sus fracciones, sus negatividades, sus nulidades, la nada, nada infinita, nada lemniscática, nada redonda y pueril, nada feliz en la que uno se pierde sin dilación en una ecuación diferencial diferente a lo esperable, una nada inestimable, incalculable, una nada que forma operaciones como versos sueltos en un cosmos ingrávido.

Uno imagina cuando encuentra por primera vez números a los que llama irracionales que el amor debe de estar escondido en el número π o que la i no es la e, pero ambas comparten la letra como signo último al que referirse, en el que habitar, en el que albergarse hasta que paren de llover decimales si es que alguna vez escampa; uno va más allá del signo reconocible objetivamente para abrazar el grafo, el signo asémico, la línea más o menos continua que un material traza sobre otro rompiendo y rompiéndose a nivel atómico, destrozándose para dar vida a la imagen: imagen que imagina uno cuando encuentra por primera vez números a los que llama irracionales que no lo son en el sentido que ha imaginado.

Un número son palabras

Qué mejor demostración de que un número son palabras que un traductor de números a palabras, así, tan absurdo como este que intenta transformar los números (dígitos) en palabras, especialmente orientado a crear un libro con las palabras de unos cuantos (indeterminados) decimales de números irracionales, pues hay pocas cosas más irracionales que este proyecto absurdo.

/********************************************************
    Proyecto tres14 (escrito en C)
    realizado por Giusseppe Domínguez
    a partir del día 8 de diciembre de 2019
********************************************************/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#define OK 1
#define KO 0
#define MAX_LONG 10 // Longitud máxima de nombre de dígito

int firma();
int digitea(char caracter);
int nombranumero(int idioma, char caracter, char *nombre);
int instrucciones(char *comando);

int main(int argc, char *argv[])
{
  int i, idioma=0;
  char nombrenumero[MAX_LONG], caracter;
  FILE *fp;
 
  if ((argc < 2) || (argc > 3)) { instrucciones(argv[0]); } // Faltan argumentos
  else if (argc == 2) { // Número desde línea de comando
    for (i=0; i<strlen(argv[1]); i++) {
      caracter=argv[1][i];
      if(! nombranumero(idioma, caracter, nombrenumero)) { instrucciones(argv[0]); return KO; }
      puts(nombrenumero);
    }
  }
  else if (argc == 3) { // Número en fichero argv[2]
    if ( (! isdigit(argv[1][0])) || ((idioma = digitea(argv[1][0])) > 1) ) {
      printf("[ERROR] No conocemos el idioma: %s\n", argv[1]);
      instrucciones(argv[0]);
    } 
    else if ((fp = fopen(argv[2],"r")) == NULL) {
      printf("[ERROR] intentando abrir el archivo %s\n", argv[2]);
      instrucciones(argv[0]);
    }
    else {
      while ((caracter = fgetc(fp)) != EOF) {
        if (caracter != '\n') { // Ignoramos los saltos de línea
          if (! nombranumero(idioma, caracter, nombrenumero)) { instrucciones(argv[0]); return KO; }
          printf("%s ", nombrenumero);
        }
      }
    }
  }
  printf("\n");
  firma();
  return OK;
}


/******************************************
  La función instrucciones hace lo que su nombre
  indica: Imprime las instrucciones del programa.
******************************************/
int instrucciones(char *comando) {
    printf("\nUtilización: %s [número_positivo] [idioma fichero]\n\n", comando);
    puts("Si introducimos un nombre de fichero, el primer parámetro indica el idioma");
    puts("Idioma puede ser:");
    puts("\t0 - Español");
    puts("\t1 - Inglés");
}

/******************************************
  La función nombranumero nombra el número
  contenido en el caracter (si procede, claro)
  y devuelve error si no lo consigue.
  idioma = 0 (español)
           1 (inglés)
******************************************/
int nombranumero(int idioma, char caracter, char *nombre) {
  int digito;
  static int nomascomas=0; // Para no encontrar más de una coma en un argumento
  // char *numeros[] = { "cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve" };
  char *numeros[2][MAX_LONG] = {
    { "cero", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete", "ocho", "nueve" },
    { "zero", "one", "two", "three", "for", "five", "six", "seven", "eigth", "nine" }
  };
  char *coma[] = { "coma", "point" };

  if ((caracter == ',') || (caracter == '.')) {
    strcpy(nombre, coma[idioma]);
    if (++nomascomas > 1) {
      printf("Un número no puede tener más de una coma\n");
      return KO;
    }
    return OK;
  }
  else if (isdigit(caracter)) {
    digito = digitea(caracter);
    strcpy(nombre, numeros[idioma][digito]);
    return OK;
  }
  printf("[ERROR] |%c| No es un caracter válido en un número positivo\n", caracter);
  strcpy(nombre, "ERROR");
  return KO;
}
/******************************************
  La función digitea devuelve un número entero
  a partir del caracter (char) proporcionado
******************************************/
int digitea(char caracter)
{
  int digito;
  digito = (int) (caracter + '0');
  digito -= 96;
  return digito;
}


int firma()
{
  time_t tiempo = time(0);
  struct tm *tiempolocal = localtime(&tiempo);
  char txt_firma[128];
  strftime(txt_firma,128,"\nGiusseppe Domínguez, a las %H:%M. M-%Y%m%d\n",tiempolocal);
  printf("%s\n",txt_firma);
  return OK;
}

qrqrqrqr de Carmen de la Rosa

Carmen de la Rosa

Entre los zapatos de cristal,
rosas de hielo
se me ha congelado el alma, cristalina
de azul fuego

Llegó anunciada de antaño y estaño vs. deambulando
por cúmulos de arena y brisa de seda
recia
crujiendo cobarde, de la rectitud al desplome y entre versos de longevas dinastías se alzó, como una sirena que atisba un barco desde su océano infinito.

Cuan si fuese poetisa, diosa del infinito
emergió

Y mientras la tinta,
negra,
de punta a punta
y gota a gota, se clavaba en edificios de mármol,
las palabras se deshacían.
La sal en el agua
y en la tierra sucumbieron.
La luz de la manta que me cobijaba se llenó de langostas
SÍ!
SÍ!
SÍ!

Y dándome cuenta las notas, la música, las campanas y el latido se hicieron una en el silencio.

Recibido desde su página personal el día 15 de enero de 2020, tras terminar la edición online del libro qrqrqrqr. Quizá aún dé tiempo de incluirla en la versión en papel.

qrqrqrqr

Libro de códigos QR y poemas escritos y enviados desde una dirección URL generada para la ocasión por 33 diferentes poetas.

En las ocasiones donde el o la poeta no hicieron llegar sus textos, se ha optado por dejar la referencia a la página web en cuestión por si alguien quiere tomar el relevo y enviar algún poema en su nombre de cara al futuro.

Como todo proyecto de arte postal, es una botella lanzada al océano que, en más ocasiones de las esperadas, regresa con provisiones para aguantar la vida.

Giusseppe Domínguez les propuso a 33 personas participar en este libro enviándoles por correo postal un código QR impreso sobre hojas de una edición de Las Flores del Mal, de Baudelaire, que redireccionaba a una página que contenía un formulario personalizado así como un código QR con el nombre de la persona invitada a formar parte del proyecto.

El libro contiene los QR personalizados para cada poeta, así como los poemas de aquellas personas que cumplimentaron sus formularios poéticos con un poema.

75% de despojos

de repente un día mueres

deja un 75% de despojos.

tres primeras sílabas
para decir lo obvio:
de la vida a la muerte
hay
un salto cuántico
un salto cualitativo
un salto irreversible

no puede ser de otro modo
tal como están definidas ambas palabras
en ese lenguaje
de lógica bivalente
tan binario
que garantiza principio del tercero excluso
tertium non datur

tres primeras sílabas
ejercitando oulipianamente
su apego a la única vocal
que Perec secuestra

tres segundas sílabas
que no lo parecen
por aquella sinalefa que ha sido ignorada
por aquel hiato que rompe el diptongo
por la preponderancia de vocales diferentes
que alcanza el 60%
de tan sólo (con tilde) cinco letras

tres segundas sílabas
que sitúan en el tiempo
absolutamente indefinido (en cuanto a cuándo
(¿qué día?)
absolutamente indefinido (en cuanto a cuánto
(¿día sidéreo o día solar?)

un suceso
que podemos calificar con once letras como
un suceso inacabable
un suceso inagotable
un suceso inapagable
un suceso inapelable
un suceso inatacable
un suceso inatajable
un suceso incachable
un suceso incalmable
un suceso incansable
un suceso incansable
un suceso incantable
un suceso incobrable
un suceso incontable
un suceso inculpable
un suceso indeseable
un suceso inevitable
un suceso inexorable
un suceso inexpiable
un suceso infaltable
un suceso inflamable
un suceso inglosable
un suceso ingustable
un suceso inhallable
un suceso inimitable
un suceso injertable
un suceso inllevable
un suceso inmancable
un suceso inoperable
un suceso inopinable
un suceso inoxidable
un suceso insaciable
un suceso insalvable
un suceso insociable
un suceso insoldable
un suceso insondable
un suceso intachable
un suceso integrable
un suceso intragable
un suceso intratable
un suceso intricable
un suceso inubicable
un suceso invadeable
un suceso invaluable
un suceso invariable
un suceso inviolable
un suceso inyectable

 
hasta que llegas al mismo
término
a esa segunda persona
que te asusta
porque asusta a otro
que somos yo

esas dos llanas sílabas
de las ocho iniciales
que son el despojo
que no son el despojo
que son la enjundia
el non plus ultra
el meollo de la frase
lo verdaderamente importante
y a lo que no quieres llegar
por lo que te amparas en otras seis
previas unidades silábicas
que te conducen
inexorablemente
al fin

Búsqueda de palabras en la RAE en línea de comandos

He fabricado un script (un lote de comandos) de bash shell en Linux para descargar y juguetear con búsquedas en la RAE, ya que resulta complicado pedir que tengan la deferencia de hacerla disponible para el público, como si la RAE fuese un organismo público pagado con dinero público.

Es el paso intermedio entre buscar una palabra y descargarme el diccionario completo palabra a palabra. Ahora toca hacer un pequeño programita que lo invoque para cada una de las palabras que tecleé para el proyecto de Isidoro Valcárcel Medina hace unos años y traiga sus definiciones.

Lo he llamado buscaenrae.sh.

Esta versión está modificada sobre la que publiqué hace unos días para subsanar errores relacionados con las palabras que contienen varias entradas/acepciones (no es lo mismo acepciones que entradas y soy consciente de ello, pero no es importante), así como para retirar las conjugaciones en los verbos.

#!/bin/bash

### FUNCIONES ÚTILES PARA EL PROGRAMA
# uso() Instrucciones del programa y salida en caso de error.
uso () {
  echo "Uso: $0 salida palabra"
  echo -e "\tsalida es un valor númerico que identifica:"
	echo -e "\t[0] para generar un archivo HTML con la respuesta"
	echo -e "\t[1] para generar un archivo TXT  con la respuesta"
	echo -e "\t[2] para generar una línea  TXT  con la respuesta"
  exit
}
f_verbos="00000_VERBOS.txt"
f_errores="00000_ERRORES.txt"

# CONTROL DE ENTRADA DE VARIABLES y ASIGNACIÓN
if [ $# -lt 2 ]
then
  # Reportar uso inapropiado
  uso
else
  salida=$1
  if [ $# -eq 2 ]; then
    palabra="$2"
  elif [ $# -eq 3 ]; then 
    palabra="$2 $3"
  elif [ $# -eq 4 ]; then 
    palabra="$2 $3 $4"
  elif [ $# -eq 5 ]; then 
    palabra="$2 $3 $4 $5"
  fi
  # echo "Palabra es #$palabra#"
fi

# CONSULTA DEL SERVIDOR de la RAE simulando ser uno de los diversos navegadores posibles
navegador=(
  "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1"
  "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:77.0) Gecko/20100101 Firefox/77.0"
  "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:77.0) Gecko/20190101 Firefox/77.0"
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A"
)
rnd=`echo $(($RANDOM%${#navegador[@]}))` # Elegimos un navegador al azar
# Hacemos la petición a la web de la RAE
curl -s --user-agent "${navegador[$rnd]}" https://dle.rae.es/"$palabra" > ./"$palabra.html"

# PROCESAMOS EL ARCHIVO OBTENIDO (Cortamos, retiramos lo innecesario, etc)
# Si se trata de un verbo, quitar las conjugaciones
id_conjugacion="
" esunverbo=`grep -c "$id_conjugacion" ./"$palabra.html"` if [ $esunverbo -gt 0 ] then echo "$palabra es un verbo" >> $f_verbos # ELIMINAMOS la(s) CONJUGACIÓN(ES) sed -i "/${id_conjugacion}/d" ./"$palabra.html" fi # Si tiene más de una acepción (Calcular cuántas después de saber si es un verbo) id_acepcion="
" num_acepciones=`grep -c "$id_acepcion" ./"$palabra.html"` # Si no tiene acepciones, la palabra no existe. No continuamos. if [ $num_acepciones -eq 0 ] then echo "$palabra no se ha encontrado en la RAE" >> $f_errores rm "./$palabra.html" exit fi # PARTIR en $num_acepciones EL FICHERO $palabra.html" # acepciones y acepciones_fin son 2 arrays de líneas PRECISO CONVERTIRLOS a cortes[] acepciones=`grep -n "$id_acepcion" ./"$palabra.html"|awk -F":" '{print $1}'|sed ':a;N;$!ba;s/\n/ /g'` c=0 for i in $acepciones do let cortes[$c]=$(($i)) let c=$(($c+1)) done acepciones_fin=`grep -n "$id_acepcion_fin" ./"$palabra.html"|awk -F":" '{print $1}'|sed ':a;N;$!ba;s/\n/ /g'` c=0 for i in $acepciones_fin do let cortes_fin[$c]=$(($i)) let c=$(($c+1)) done # GENERA FICHEROS palabra.X.html por cada ACEPCIÓN for (( i=0; i<$num_acepciones; i++ )) do # echo "El comienzo del corte está en ${cortes[$((i))]}" # echo "El fin del corte está en ${cortes_fin[$((i))]}" sed "${cortes[$((i))]},${cortes_fin[$((i))]} !d" "./$palabra.html" > "./$palabra.$i.html" # Distintas salidas del programa, en función de la variable "salida" if [ $salida -gt 0 ] # Salida a modo TXT then w3m "./$palabra.$i.html" > "./$palabra.$i.txt" if [ $salida -gt 1 ] # En una sóla línea then sed ':a;N;$!ba;s/\n/ /g' "./$palabra.$i.txt"|sed 's/ / /g' > "./$palabra.$i.1linea" fi fi done # BORRAR indica si dejar o no los archivos que no se deseen como salida BORRAR=1 if [[ $BORRAR -eq 1 ]] && [[ $salida -gt 0 ]] then rm "./$palabra."*html if [ $salida -eq 2 ] then rm "./$palabra."*txt fi fi # SALIDA FORZADA exit

Las primeras pruebas las he realizado con la palabra palabra, como debe ser.

buscaenrae.sh 2 palabra

Potencias

Adoro las potencias del 3. Seguro que ya lo sabes si has leído algo de mi trabajo… sin ir más lejos el que está dedicado completamente a juegos con ello, como es el proyecto !ç~ñ¿.#.

Pero estaba jugueteando con darle una respuesta automática a un amigo sobre cuáles eran las potencias de 3 y no tenía ningún programita que las calculase. ¡¿Habrase visto?!

Así que tenía que hacerlo. Decidí hacerlo a partir de una modificación del 17 amores, que le regalé a Carmen en nuestro decimoséptimo aniversario. Aunque me precipité y lo escribí mal un par de veces (siendo algo trivial) por exceso de confianza. Aquí está la versión definitiva (muy muy mejorable), que me dan ganas de escribir también en Python o en BASIC.

#!/bin/bash
# Escribe todas las potencias de un número dado (3, por ejemplo)
# hasta una cantidad dada (17, por ejemplo)

razon=3;
producto=3;
cantidad=17;

for ((i=1; i<=$cantidad; i++)); do
  producto=$(($producto*$razon));
  echo -e $(($producto/$razon)) " x " $razon " = " $producto
done

Por supuesto, el resultado de esta ejecución es sencillo y casi diría tonto:

3 x 3 = 9
9 x 3 = 27
27 x 3 = 81
81 x 3 = 243
243 x 3 = 729
729 x 3 = 2187
2187 x 3 = 6561
6561 x 3 = 19683
19683 x 3 = 59049
59049 x 3 = 177147
177147 x 3 = 531441
531441 x 3 = 1594323
1594323 x 3 = 4782969
4782969 x 3 = 14348907
14348907 x 3 = 43046721
43046721 x 3 = 129140163
129140163 x 3 = 387420489
Esto no es una broma