Herramientas de usuario

Herramientas del sitio


Barra lateral

====== Categorías ====== {{:carpeta.png?nolink|}} **[[foro|FORO]]** Manuales y tutoriales que explican como utilizar el foro. ---- {{:carpeta.png?nolink|}} **[[descarga|DESCARGA]]** Clientes P2P, configuraciones y todo para descargar al máximo. ---- {{:carpeta.png?nolink|}} **[[seguridad|SEGURIDAD]]** Antivirus, Firewalls, todo es configurable bajo estás guías. ---- {{:carpeta.png?nolink|}} **[[so|SO]]** GNU/Linux, Windows, guías de instalación y solución de problemas. ---- {{:carpeta.png?nolink|}} **[[video|VIDEO]]** Indice de videotutoriales del wiki. ---- {{:carpeta.png?nolink|}} **[[utilidades|UTILIDADES]]** Aplicaciones varias y tips de uso. ----

A PCRE internal error occured. This might be caused by a faulty plugin
so:linux:pasar_datos_dinamicos_a_dialog_en_bash

Tutorial creado por [[http://www.argentop2p.net/index.php?action=profile;u=24532|ThecaTTony]] para elgatolibre.com.ar ====== Pasar datos dinámicos a dialog en bash ====== Trabajando en un par de scripts [[https://es.wikipedia.org/wiki/Bash|Bash]] me encontré con algo realmente molesto y que me costó mucho trabajo sortear, motivo por el cual quiero compartir el conocimiento adquirido. El problema inicial se dió cuando estaba trabajando con varios datos separados por espacios y comillas, necesarios para armar un menú con dialog: <code bash>#fcontacto Establece la variable $vcontacto function fcontacto(){ unset vcontacto vcontacto=$(dialog --title "Selección de contacto." --menu "Seleccione el contacto:" 10 40 4 $vlista ); if [ $? -ne 0 ] then dialog --title 'Advertencia' --msgbox "No se ha seleccionado ningún contacto." 6 40 ; fpregunta ; fi }</code> La función **fcontacto** muestra por medio de dialog un menú con nombres de contacto y su correspondiente nombre y apellido como descripción. Al seleccionar uno de los items del menú, el nombre de contacto es establecido en la variable **$vcontacto** para utilizarla luego. Posteriormente se evalúa el código de salida y en caso de que sea distinto de 0 se muestra una advertencia y se lleva a una función de loop, que pregunta si se desea comenzar nuevamente o salir. Lo importante aquí es la variable **$vlista** que se obtiene de interpretar un archivo de texto: <code bash>vlista=$(egrep -v '#' $vconfigdir/lista | awk -F "," '{ print $1 "\""$2"\"" }' | tr '\n' " ")</code> Donde **$vconfigdir/lista** es un archivo que contiene datos separados por coma, un usuario por línea y permitiendo algún comentario mediante **#**: <code>#lista de usuarios jperez,Juan Perez jlopez,Juan Lopez</code> Que tras ser procesada da como resultado algo similar a: <code>jperez "Juan Perez" jlopez "Juan Lopez"</code> Pero por más que tratara los datos no eran interpretados de la manera deseada, en vez de obtener esto: {{ :so:linux:dialog01.png?nolink |}} Obtenía lo siguiente: {{ :so:linux:dialog02.png?nolink |}} No me costó mucho darme cuenta lo que estaba pasando, dialog estaba viendo el contenido de la variable **$vlista** sin tener en cuenta el comillado. En vez de interpretar: <code>jperez;"Juan Perez";jlopez;"Juan Lopez"</code> Los datos de la variable se tomaban como: <code>jperez;"Juan;Perez";jlopez;"Juan;Lopez"</code> Explicado el problema vamos con la solución, trabajar los datos con un [[https://es.wikipedia.org/wiki/Array|Array o Vector (matriz de datos estructurados)]]. Primero veamos los cambios en el procesamiento de los datos de entrada: <code bash>XIFS=$IFS IFS=$'\n' alista=($(egrep -v '#' $vconfigdir/lista | awk -F "," '{ print $1 "\n" $2 }')) IFS=$XIFS</code> [[https://en.wikipedia.org/wiki/Internal_field_separator|$IFS]] es una variable propia de bash donde se definen los caracteres internos de separación, lo que bash interpretará como una separación entre un dato y otro. Como se puede observar antes de modificarla para que solo tome como separación una nueva línea, duplico **$IFS** para que luego de interpretados los datos del archivo **$vconfigdir/lista** se pueda regresar esa variable a su valor por defecto. Como se indicó, ya no se define la variable **$vlista**, sino el array **alista** y la salida del comando que interpreta los datos dará como resultado algo similar a: <code>alista[0]=jperez alista[1]=Juan Perez alista[2]=jlopez alista[3]=Juan Lopez</code> El array en cuestión nos da total independencia de un dato con otro, muy contrario a la variable en la cual ordenábamos dichos datos pero no teníamos manera de obtener uno en particular sin conocerlo. <code bash>echo ${alista[2]} # muestra el dato 2 (empezando desde 0) echo ${alista[@]} # muestra todos los datos del array echo ${alista[#]} # muestra la cantidad de datos (en este caso 4)</code> Y por último la modificación pertinente en la función **fcontacto**: <code bash>#fcontacto Establece la variable $vcontacto function fcontacto(){ unset vcontacto vcontacto=$(dialog --title "Selección de contacto." --menu "Seleccione el contacto:" 10 40 4 "${alista[@]}" ); if [ $? -ne 0 ] then dialog --title 'Advertencia' --msgbox "No se ha seleccionado ningún contacto." 6 40 ; fpregunta ; fi }</code> Como se puede ver, pasarán todos los datos del array pero c/u entrecomillado, para que no ocurra nuevamente el error de mezclar los campos. Especial agradecimiento al usuario <em>aru</em> de mandrivausers.org, que fue quién con su modesto post me indicó el camino a seguir. Fuente: [[http://mandrivausers.org/index.php?/topic/21998-reading-a-text-file-line-by-line-with-bash/page__view__findpost__p__164692]] ---- Cualquier comentario, sugerencia y/o consulta pueden realizarla en el foro: [[http://www.argentop2p.net/index.php/board,21.0.html|{{:foro-comentarios.png?nolink|}}]]

so/linux/pasar_datos_dinamicos_a_dialog_en_bash.txt · Última modificación: 2025/12/09 21:06 (editor externo)

Herramientas de la página