Gracias, chicos por los aportes...
Me deja tranquilo que tan errado no estaba...

a) Ya se entendio lo de $'\n'...ahi estuve leyendo el man bash...debere
leerlo mas detalladamente...pasa q a veces, un  man muy largo "asusta",
jaja...

b) Ok, me queda claro que el IFS, si lo toco, luego debo volver a dejarlo
como estaba...

c) Leo: un detalle

Maxi Curia me habia sugerido:

echo "$MILISTA" | while read line; do
       echo "$line"
done

Y vos acotabas que:
"Nota que eso tambien requiere IFS=$'\n' antes del while, o va a separar
palabras en espacios tambien.  "

Sabes q no necesariamente...pues el read si recibe una sola variable, te
deja todas las palabras en la misma, hasta encontrar el newline...o sea, un
read LINEA es como un  "readline"...

d) A proposito del punto anterior: Maxi, sabes q eso lo habia probado, pero
me sucede  algo muy raro (o bien, algo que no puedo entender por que es que
sucede).

Fijense este ejemplo:

##########################################
#!/bin/bash

MILISTA=$(find /home/mmilicich -maxdepth 1 -type f)
STRING=''

echo "$MILISTA" | while read LINE ; do
    STRING="$STRING -- $LINE"
    echo "$STRING"
done

echo "STRING FINAL: $STRING"
##########################################

Cuando sale del while, la variable $STRING me sale vacia (es decir, como
antes de empezar)...
Es como que lo q le agrego a $STRING dentro del while, una vez q termina
deja de tener efecto....
Como si se abriera un proceso hijo...
Y no entiendo !!!!!
=(

Bueno, gracias por la paciencia, son mis primeros pasos en el shellscripting


Saludos!!
MA_Xx

2009/5/25 Leonardo Mosquera <[email protected]>

> 2009/5/25 Maximiliano Curia <[email protected]>
>
>> Hola Maximiliano Milicich!
>>
>> El 25/05/2009 a las 05:45 escribiste:
>> >    Hola, a ver quien me puede orientar con esto...
>>
>> >    Ando practicando shellscripting en Linux (en BASH) y tengo el
>> siguiente
>> >    desafio:
>>
>> >    Tengo una variable que aloja una lista de strings separados por
>> newlines.
>> >    Los strings podrian contener espacios en blanco...
>>
>> >    Por ejemplo:
>> >
>> >    MILISTA=$(find /algunlugar -type f)
>>
>> >    a) Como puedo recorrer los elementos de MILISTA ?
>>
>> >    En ppio el "for A in $MILISTA" separa por espacios y no por
>> newlines...
>>
>> >    googleando encontre que se puede cambiar la variable de ambiente
>> "IFS"
>> >    para definir el separador que usar el for, asi
>>
>> >    IFS=$'\n'
>> >    for A in $MILISTA ; do
>> >      echo $A
>> >    done
>>
>> IFS es bastante especial, si lo cambias y pretendes seguir operando con
>> cosas
>> separadas por campos es probable que te convenga volverlo al valor
>> anterior.
>>
>> >    Esto funciona ok, pero...hay alguna manera mas intuitiva de hacerlo
>> ??
>>
>> Para cierto valor de "intuitivo", si:
>>
>> echo "$MILISTA" | while read line; do
>>        echo "$line"
>> done
>
>
> Nota que eso tambien requiere IFS=$'\n' antes del while, o va a separar
> palabras en espacios tambien.
>
> Cuando bash interpreta expresiones ("variable expansion" segun descripto en
> el man de bash), a lo ultimo separa la expresion en "palabras", usando como
> separador todos los caracteres contenidos en IFS.
> Por defecto IFS tiene el espacio, el tab y el newline; por eso cualquier
> cosa que evalues se corta en espacios y no sirve para trabajar de a lineas,
> por ejemplo con la salida de un comando o las lineas de un archivo.
>
> La unica forma que tenes de evitar separar en espacios, es redefiniendo IFS
> para sacar el caracter espacio; no hay una forma tacita de hacerlo que yo
> sepa. Pero tampoco es tan criptico si lo pensas.
>
>
>> >    b) NO ENTIENDO COMO ES QUE SE INTERPRETA $'\n' !!!!!   =(
>> >    Es decir...funciona, pero....que demonios es $'\n'   ??
>>
>> Es la forma tradicional de representar el caracter nueva linea (byte 10).
>>
>
> Agrego algo: si te fijas en man bash, esa es una notacion para introducir
> caracteres no imprimibles en una expresion.
> En C tenes, entre otros, los siguientes caracteres especiales: \n \t etc.
> Bash te deja usarlos con esa tal notacion $'C', donde C es el caracter
> especial.
> Eso tampoco es tan criptico una vez que lo entendes (aunque ojala lo
> hubieran hecho mas facil de tipear).
>
>
>
> _______________________________________________
> Lista de correo Programacion.
> [email protected]
> http://listas.fi.uba.ar/mailman/listinfo/programacion
>
>
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a