2010/11/15 Marc Aymerich <[email protected]>: > 2010/11/15 Marc Aymerich <[email protected]>: >> 2010/11/15 Javier Barroso <[email protected]>: >>> 2010/11/14 Marc Aymerich <[email protected]>: >>>> 2010/11/14 Javier Barroso <[email protected]>: >>>>> 2010/11/13 Marc Aymerich <[email protected]>: >>>>>> Y Ahora para borrar tendrías que usar algo parecido a esto: >>>>>> >>>>>> if [ "$c" == "$(echo backspace)" ]; then a={$a%?}; fi >>>>>> >>>>>> Desgraciadamente esto ultimo no te va a funcionar, No se como hacer un >>>>>> echo del carácter backspace !! :D Pero si logras comparar $c con >>>>>> backspace ahí lo tienes :) . >>>>> >>>>> Puedes coger ese caracter con: >>>>> >>>>> backspace=$(echo -en '\b') al principio del script y luego usar >>>>> "$backspace" para comparar >>>>> >>>>> Sigo sin tener un bash a mano para hacer la prueba oportuna, pero creo >>>>> que podría funcionar como dice Marc >>>> >>>> >>>> Buenas Javier, el carácter backspace es un poco puñetero. Yo estoy >>>> probando con gnome-terminal y al parecer cuando pulsas backspace el >>>> carácter que le llega a bash no es "\b" sino "\x7F". No se si las >>>> otras terminales se comportan igual. Bueno que para que al menos a mi >>>> me funcione tengo que hacer la comparación así: >>>> if [ "$c" == "$(echo -ne "\x7F")" ]; then a=${a%?}; >>>> >>>> y de ninguna otra manera he conseguido que funcione :( >>>> >>>> >>>> Rantis prueba este código a ver que te parece: >>>> >>>> #!/bin/bash >>>> while IFS= read -r -n1 c; do >>>> if [ "$c" == "$(echo)" ]; then break; fi >>>> if [ "$c" == "$(echo -ne "\x7F")" ]; then >>>> a=${a%?}; >>>> echo -en "\r$a ${#a} " >>>> else a="$a$c" >>>> echo -en "\r$a ${#a}" >>>> fi >>>> done >>>> echo "El string resultante es: $a" >>>> >>>> Por desgracia aún faltaría pulir unos caracteres desagradables que >>>> aparecen al pulsar backspace. >>> >>> Se arregla con el -s en el read: >>> cad="" >>> while IFS= read -s -r -n 1 c; do >>> if [[ "$c" == $(echo -e '\x7f') ]]; then cad=${cad%?}; else cad="$cad$c"; >>> fi; >>> printf "%-50s\r" "$cad [${#cad}]"; >>> done >> >> Muy buena solución javier. >> Con esto hemos llevado el comando read al limite, pocas opciones hemos >> dejado para usar ;) >> > > Ya veis lo aburrido que estoy hoy que me he tomado tiempo para decorar > un poco el programa: > > #!/bin/bash > limit=140 > cad="" > > out=$(printf "\r$cad%$((${#cad}-$limit))s") > echo -ne "${out// /_} [${#cad}/$limit]" > > while IFS= read -s -r -n 1 c; do > if [ "$c" == "$(echo)" ]; then break; fi > if [[ "$c" == $(echo -ne "\x7f") ]]; then > cad=${cad%?}; > else > if [ ${#cad} == $limit ]; then > if [[ "$c" == $(echo -ne "\x7f") ]]; then > cad=${cad%?}; > fi; > else > cad="$cad$c"; > fi; > fi; > out=$(printf "$cad%$((${#cad}-$limit))s") > echo -ne "\r${out// /_} [${#cad}/$limit]" > done > > echo -ne "\nResulting string: $out\n"
para ser un poco rigurosos el string resultante no es $out sino $cad: echo -ne "\nResulting string: $cad\n" -- Marc -- To UNSUBSCRIBE, email to [email protected] with a subject of "unsubscribe". Trouble? Contact [email protected] Archive: http://lists.debian.org/[email protected]

