Puede que tenga algo absolutamente incorrecto, pero me parece convincente, que establecer IFS como uno de los comandos en la lista pre-do / done no tiene absolutamente ningún efecto.
El IFS externo (fuera de la while
construcción) prevalece en todos los ejemplos que se muestran en el script a continuación.
¿Que está pasando aqui? ¿Tengo una idea equivocada de lo que hace IFS en esta situación? Esperaba que los resultados de la división de matriz fueran como se muestran en la columna "esperada".
#!/bin/bash
xifs() { echo -n "$(echo -n "$IFS" | xxd -p)"; } # allow for null $IFS
show() { x=($1)
echo -ne " (${#x[@]})\t |"
for ((j=0;j<${#x[@]};j++)); do
echo -n "${x[j]}|"
done
echo -ne "\t"
xifs "$IFS"; echo
}
data="a b c"
echo -e "----- -- -- \t --------\tactual"
echo -e "outside \t IFS \tinside"
echo -e "loop \t Field \tloop"
echo -e "IFS NR NF \t Split \tIFS (actual)"
echo -e "----- -- -- \t --------\t-----"
IFS=$' \t\n'; xifs "$IFS"; echo "$data" | while read; do echo -ne '\t 1'; show "$REPLY"; done
IFS=$' \t\n'; xifs "$IFS"; echo "$data" | while IFS= read; do echo -ne '\t 2'; show "$REPLY"; done
IFS=$' \t\n'; xifs "$IFS"; echo "$data" | while IFS=b read; do echo -ne '\t 3'; show "$REPLY"; done
IFS=" "; xifs "$IFS"; echo "$data" | while read; do echo -ne '\t 4'; show "$REPLY"; done
IFS=" "; xifs "$IFS"; echo "$data" | while IFS= read; do echo -ne '\t 5'; show "$REPLY"; done
IFS=" "; xifs "$IFS"; echo "$data" | while IFS=b read; do echo -ne '\t 6'; show "$REPLY"; done
IFS=; xifs "$IFS"; echo "$data" | while read; do echo -ne '\t 7'; show "$REPLY"; done
IFS=; xifs "$IFS"; echo "$data" | while IFS=" " read; do echo -ne '\t 8'; show "$REPLY"; done
IFS=; xifs "$IFS"; echo "$data" | while IFS=b read; do echo -ne '\t 9'; show "$REPLY"; done
IFS=b; xifs "$IFS"; echo "$data" | while IFS= read; do echo -ne '\t10'; show "$REPLY"; done
IFS=b; xifs "$IFS"; echo "$data" | while IFS=" " read; do echo -ne '\t11'; show "$REPLY"; done
echo -e "----- -- -- \t --------\t-----"
Salida:
----- -- -- -------- actual
outside IFS inside assigned
loop Field loop # inner
IFS NR NF Split IFS # expected IFS
----- -- -- -------- ----- # --------- --------
20090a 1 (3) |a|b|c| 20090a #
20090a 2 (3) |a|b|c| 20090a # |a b c| IFS=
20090a 3 (3) |a|b|c| 20090a # |a | c| IFS=b
20 4 (3) |a|b|c| 20 #
20 5 (3) |a|b|c| 20 # |a b c IFS=
20 6 (3) |a|b|c| 20 # |a | c| IFS=b
7 (1) |a b c| #
8 (1) |a b c| # |a|b|c| IFS=" "
9 (1) |a b c| # |a | c| IFS=b
62 10 (2) |a | c| 62 # |a b c| IFS=
62 11 (2) |a | c| 62 # |a|b|c| IFS=" "
----- -- -- -------- ----- --------- -------
$IFS
se eliminan al principio / al final de la línea de entrada, supongo? (Así es como funciona.)a<tab>b
enread var
dará lugar a var tener el valora<space>b
, pero si por el contrario tieneIFS='<newline>' read var
entonces el valor de var seráa<tab>b
.En pocas palabras, debe leer más de una variable a la vez para que la
IFS=<something> read ...
construcción tenga un efecto visible en sus ejemplos 1 .Echas de menos el alcance de
read
en los ejemplos. No hay modificación de IFS dentro del ciclo en sus casos de prueba. Permítanme señalar exactamente, ¿dónde tiene efecto el segundo IFS en cada una de sus líneas:Es igual que con cualquier programa ejecutado en el shell. La variable que (re) define en la línea de comandos afecta la ejecución del programa. Y solo eso (ya que no exportas). Por lo tanto, para hacer un uso de redefinido
IFS
en dicha línea, tendría que pedirread
asignar valores a más de una variable . Echa un vistazo a estos ejemplos:1 Como acabo de aprender de Gilles , en realidad podría ser beneficioso establecer
IFS=''
(en blanco) al leer solo un campo: evita el truncamiento del espacio en blanco al comienzo de la línea.fuente
IFS= read
usa con preferencia para volver a configurar la variable de entorno IFS"? No tenía conciencia, entonces, que las variables locales podrían ser establecidas por el llamante de un comando. Esa fue la respuesta a esa pregunta. Evolucionó aún más para abordar el punto principal de esta pregunta, pero cuando me di cuenta de eso, ya había hecho esta pregunta ... Tal vez las dos preguntas son tan similares como dossed
preguntas, por lo que siento que lo mantengo así ... Más títulos para googlers a google.