{"id":3025,"date":"2012-10-09T23:11:45","date_gmt":"2012-10-09T21:11:45","guid":{"rendered":"http:\/\/robertopla.net\/blog\/?p=3025"},"modified":"2012-10-09T23:11:45","modified_gmt":"2012-10-09T21:11:45","slug":"problema-con-shell-scripting","status":"publish","type":"post","link":"https:\/\/robertopla.net\/blog\/problema-con-shell-scripting.htm","title":{"rendered":"Problema con Shell Scripting"},"content":{"rendered":"<p><img decoding=\"async\" src=\"http:\/\/robertopla.net\/blog\/img\/shell-scripting-9788441528079.jpg\" style=\"border: medium none ; margin: 0px 8px 8px 0px; width:200px;height:257px; float: left;\" alt=\"shell-scripting\" title=\"shell-scripting\" \/>Resulta que quer\u00eda aprender a hacer scripts en el Shell de Linux. No scripts perrilleros, copiadillos de una p\u00e1gina de internet, soluciones estandar que luego no te acuerdas donde las copiaste y que tecleas sin entender nada de nada.<br \/>\nQuer\u00eda aprender como funcionan los scripts del shell porque un script adecuado te soluciona un mont\u00f3n de problemas y te ahorra un mont\u00f3n de tiempo, pero tienes que saber como funciona, y como montarlo. Adem\u00e1s para administrar el sistema en cosas como las copias de seguridad y otras tareas de higiene inform\u00e1tica, tener unos cuantos scripts que se ejecuten peri\u00f3dicamente puede ahorrar much\u00edsimo trabajo.<br \/>\nAs\u00ed que hice lo que suelo hacer siempre que quiero aprender algo nuevo: comprar un libro. Aprender a programar requiere su tiempo, quiz\u00e1s no mucho, pero hay que ponerse, entender los comandos, ver como funcionan las estructuras de control y las asignaciones de valores, &#8230;en Linux hay que captar la idea de las expresiones regulares -un mundo en si mismas- y las redirecciones o &#8216;tuberias&#8217;.<br \/>\nHe hecho un sencillo programa &#8211; el conocido <em>\u00abHola Mundo\u00bb<\/em>&#8211; en multitud de lenguajes y he llegado a hacer programas funcionales en unos cuantos entre los que est\u00e1n el ensamblador del Z80, <a href=\"http:\/\/es.wikipedia.org\/wiki\/Notaci%C3%B3n_polaca_inversa\">RPN<\/a>, C, BASIC, dBaseII\/Clipper o php. Es decir, no es que sea un gur\u00fa de la programaci\u00f3n, pero me he ido defendiendo.<br \/>\nSin embargo, el shell scripting me tiene m\u00e1s quemado que la pipa de un indio. Estoy atascado en el segundo ejemplo del libro \u00abShell Scripting\u00bb de Ron Peters, p\u00e1gina 22. Claro que podr\u00eda 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\u00e9 como funciona o al menos por qu\u00e9 no funciona.<br \/>\nCopio el ejemplo tal cual viene en el libro:<\/p>\n<p><code>#!\/bin\/sh<br \/>\n#set -x<br \/>\necho -n \"Can you write device drivers?\"<br \/>\nread answer<br \/>\nanswer = 'echo $answer | tr [a-z] [A-Z]'<br \/>\nif [ $answer =  Y ]<br \/>\nthen<br \/>\n  echo \"Wow, you must be very skilled\"<br \/>\n else<br \/>\n  echo \"Neither can I, I'm just an example shell script\"<br \/>\nfi<\/code><\/p>\n<p>Lo guardo como ejemplo02.sh y le doy permisos de ejecuci\u00f3n. Cuando lo ejecuto, obtengo esto:<\/p>\n<p><code>$ .\/ejemplo02.sh<br \/>\nCan you write devide drivers? y<br \/>\n.\/ejemplo02.sh: 5: .\/ejemplo02.sh: answer: not found<br \/>\nNeither can I, I'm just an example shell script<br \/>\n$ <\/code><\/p>\n<p>Despu\u00e9s de devanarme los sesos y buscar por el mundo, encontr\u00e9 en alg\u00fan sitio o alguien me dijo, que en la versi\u00f3n 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 \u00abok\u00bb obtengo esto:<\/p>\n<p><code>$ tr [a-z] [A-Z] <zx\nOK \n$ tr a-z A-Z <zx\nOK \n$<\/code><\/p>\n<p>Est\u00e1 claro que el problema est\u00e1 en la asignaci\u00f3n+tuber\u00eda de la linea 5:<br \/>\n<code>answer = 'echo $answer | tr a-z A-Z'<\/code><br \/>\nY 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\u00edda por <em>read<\/em> a may\u00fasculas. 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.<\/p>\n<p>Estoy usando Kubuntu 12.04: Linux 3.2.0-31 y KDE SC 4.8.5 en un AMD Phenom II X4 810<br \/>\nLa versi\u00f3n de GNU bash es 4.2.24(1)-release (x86_64-pc-linux-gnu)<\/p>\n<p>He preferido explicarlo aqu\u00ed 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\u00e1gina 23 resolviendo este peque\u00f1o pero impenetrable misterio. Acepto respuestas en los comentarios (lo siendo, debido al SPAM hay que registrarse) o en mi correo: <em>pla[arroba]aire.org<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Quer\u00eda aprender como funcionan los scripts del shell porque un script adecuado te soluciona un mont\u00f3n de problemas y te ahorra un monton de tiempo, pero tienes que saber como funciona, y como montarlo. <a href=\"https:\/\/robertopla.net\/blog\/problema-con-shell-scripting.htm\">Sigue leyendo <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[206,209,289,311,315],"class_list":["post-3025","post","type-post","status-publish","format-standard","hentry","category-libros","tag-libro","tag-linux","tag-programacion","tag-script","tag-shell"],"_links":{"self":[{"href":"https:\/\/robertopla.net\/blog\/wp-json\/wp\/v2\/posts\/3025","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/robertopla.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/robertopla.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/robertopla.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/robertopla.net\/blog\/wp-json\/wp\/v2\/comments?post=3025"}],"version-history":[{"count":0,"href":"https:\/\/robertopla.net\/blog\/wp-json\/wp\/v2\/posts\/3025\/revisions"}],"wp:attachment":[{"href":"https:\/\/robertopla.net\/blog\/wp-json\/wp\/v2\/media?parent=3025"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/robertopla.net\/blog\/wp-json\/wp\/v2\/categories?post=3025"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/robertopla.net\/blog\/wp-json\/wp\/v2\/tags?post=3025"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}