Problema con Shell Scripting

shell-scriptingResulta que quería aprender a hacer scripts en el Shell de Linux. No scripts perrilleros, copiadillos de una página de internet, soluciones estandar que luego no te acuerdas donde las copiaste y que tecleas sin entender nada de nada.
Quería aprender como funcionan los scripts del shell porque un script adecuado te soluciona un montón de problemas y te ahorra un montón de tiempo, pero tienes que saber como funciona, y como montarlo. Además para administrar el sistema en cosas como las copias de seguridad y otras tareas de higiene informática, tener unos cuantos scripts que se ejecuten periódicamente puede ahorrar muchísimo trabajo.
Así que hice lo que suelo hacer siempre que quiero aprender algo nuevo: comprar un libro. Aprender a programar requiere su tiempo, quizás no mucho, pero hay que ponerse, entender los comandos, ver como funcionan las estructuras de control y las asignaciones de valores, …en Linux hay que captar la idea de las expresiones regulares -un mundo en si mismas- y las redirecciones o ‘tuberias’.
He hecho un sencillo programa – el conocido «Hola Mundo»– en multitud de lenguajes y he llegado a hacer programas funcionales en unos cuantos entre los que están el ensamblador del Z80, RPN, C, BASIC, dBaseII/Clipper o php. Es decir, no es que sea un gurú de la programación, pero me he ido defendiendo.
Sin embargo, el shell scripting me tiene más quemado que la pipa de un indio. Estoy atascado en el segundo ejemplo del libro «Shell Scripting» de Ron Peters, página 22. Claro que podría haber saltado el maldito ejemplo y haber seguido adelante, pero no puedo dejar enemigos a la espalda ni soportar la idea de que hay algo que no sé como funciona o al menos por qué no funciona.
Copio el ejemplo tal cual viene en el libro:

#!/bin/sh
#set -x
echo -n "Can you write device drivers?"
read answer
answer = 'echo $answer | tr [a-z] [A-Z]'
if [ $answer = Y ]
then
echo "Wow, you must be very skilled"
else
echo "Neither can I, I'm just an example shell script"
fi

Lo guardo como ejemplo02.sh y le doy permisos de ejecución. Cuando lo ejecuto, obtengo esto:

$ ./ejemplo02.sh
Can you write devide drivers? y
./ejemplo02.sh: 5: ./ejemplo02.sh: answer: not found
Neither can I, I'm just an example shell script
$

Después de devanarme los sesos y buscar por el mundo, encontré en algún sitio o alguien me dijo, que en la versión GNU de tr no se usan los corchetes [] para las series de caracteres, pero tras una prueba en linea de comandos, veo que es indiferente. Con un archivo de texto que llamo zx y que contiene la cadena «ok» obtengo esto:

$ tr [a-z] [A-Z]

Está claro que el problema está en la asignación+tubería de la linea 5:
answer = 'echo $answer | tr a-z A-Z'
Y aqui es donde me he roto la cabeza y no he encontrado forma humana de que esa linea haga lo que se supone que tiene que hacer: pasar la entrada leída por read a mayúsculas. He probado con todo tipo de comillas y sin comillas, con todo tipo de conexiones posibles del redireccionamiento de los comandos y sigo sin un resultado positivo. En los mejores casos la linea no produce mensaje de error, pero la variable no es modificada.

Estoy usando Kubuntu 12.04: Linux 3.2.0-31 y KDE SC 4.8.5 en un AMD Phenom II X4 810
La versión de GNU bash es 4.2.24(1)-release (x86_64-pc-linux-gnu)

He preferido explicarlo aquí que dar la tabarra a mis amigos uno por uno, pero espero que alguien se apiade de mi y permita que pase a la página 23 resolviendo este pequeño pero impenetrable misterio. Acepto respuestas en los comentarios (lo siendo, debido al SPAM hay que registrarse) o en mi correo: pla[arroba]aire.org

Esta entrada ha sido publicada en Libros y etiquetada como , , , , . Guarda el enlace permanente.

2 respuestas a Problema con Shell Scripting

  1. Pingback: Bitacoras.com

  2. Roberto Pla dijo:

    Una de las cosas que me gustan de Linux es no solo pasa que siempre hay alguien que sabe lo que necesitas, sino que además está dispuesto a ayudarte. Apenas había tuiteado la reseña de este articulo cuando recibí una respuesta por el propio Twitter:

    Israel @Coolhand_
    @adrinavarro esto es tuyo :-) RT “@rpla: Problema con shell scripting. ¿Quien me echa una mano? http://goo.gl/CkDPR

    Adrián @adrinavarro
    @Coolhand_ @rpla tan tonto como hacer la asignación sin espacios (var=»value») y poner backticks en el comando pq se espera que se ejecute

    Adrián @adrinavarro
    @Coolhand_ @rpla http://pastebin.com/RiYYvtt0

    Adrián @adrinavarro
    @rpla la explicación larga es que algo=`comando` hace que algo = el resultado de ese comando; y que si pones «algo = tal» bash ejecuta…

    Adrián @adrinavarro
    @rpla el comando «algo», porque se cree que es un ejecutable como tal (ejecutable «algo», parámetros «= tal»… no sé si me explico…

    Adrián @adrinavarro
    @rpla si puedo ayudar en algo, avisa ;) aunque de sh se mas bien poco…

Los comentarios están cerrados.