Errores de Ubuntu (14 y 16) Bash con bucles printf de entrada que contienen caracteres en minúscula "n"
Tengo algunos scripts de bash que he estado ejecutando en Ubuntu 14.04 y 16.04 durante más de un año. Alguna actualización reciente de Ubuntu ha roto bash y no puedo entender cómo solucionar esto.
Ejemplo:
#!/bin/bash
INPUT=myinput.txt
OUTPUT=myoutput.txt
ACTION1="0;"
cat $INPUT | while read LINE
do
printf "\t\"~${LINE}\"\t\t$ACTION1\n" >> $OUTPUT
done
mi script luego recorre el archivo haciendo la declaración printf de la siguiente manera pero esta es la salida producida
"~jetmo" 0;
"~spamme" 0;
"~baidu" 0;
contenido de ejemplo de myinput.txt
jetmon
spammen
baidu
Las líneas de entrada que contienen un carácter n minúscula se eliminan ?? Me estoy perdiendo algún cambio importante en bash que ocurrió, esto comenzó a suceder hace una semana y ahora me está volviendo loco.
He intentado cambiar #! / Bin / bash a #! / Bin / sh con los mismos resultados.
También probé este método de recorrer el archivo de entrada y aún así obtener los mismos resultados.
#!/bin/bash
INPUT=myinput.txt
OUTPUT=myoutput.txt
ACTION1="0;"
while read LINE
do
printf "\t\"~${LINE}\"\t\t$ACTION1\n" >> $OUTPUT
done < $INPUT
Intenté la sugerencia de los comentarios usando echo
echo -e -n "\t\"~${LINE}\"\t\t$ACTION1\n" >> $OUTPUT
y ahora obtengo esta salida
-e -n "~jetmo" 0;
-e -n "~spamme" 0;
-e -n "~baidu" 0;
Ejecutar hexdump -C myinput.txt da esta salida
00000000 6a 65 74 6d 6f 6e 0a 73 70 61 6d 6d 65 6e 0a 62 |jetmon.spammen.b|
00000010 61 69 64 75 0a 0a |aidu..|
00000016
También cambió todos los nombres de las variables a minúsculas como lo sugirió Michael, pero aún así obtiene los mismos resultados.
#!/bin/bash
input=myinput.txt
output=myoutput.txt
action1="0;"
cat $input | while read line
do
printf "\t\"~${line}\"\t\t$action1\n" >> $output
done
LA SOLUCIÓN El misterio está resuelto
gracias a todos, perohttps://stackoverflow.com/users/96588/l0b0 clavado en la cabeza. Tuve unIFS=$'\n'
escondiéndome antes en mi guión.
Ahora tengo este formato final, mejor y más seguro de printf gracias a las recomendaciones de Nahuel y Charles y está funcionando al 100% ... no puedo agradecerles lo suficiente.
#!/bin/bash
input=myinput.txt
output=myoutput.txt
action1="0;"
while IFS= read -r LINE
do
printf '\t"~%s"\t\t%s\n' "${LINE}" "$ACTION1" >> "$output"
done < $input1