Saludos,
Estoy escribiendo un script bash simple que necesita analizar el contenido de un archivo en una matriz. Las entradas en el archivo están delimitadas por "nueva línea", por lo que el archivo se vería así:
path/to/file
path/to/other/file
Me gustaría analizar los contenidos e iterarlos. Mi código actualmente se parece a:
CONTENT=`cat /path/to/text/file.txt`
for PATH in $CONTENT
do
echo $PATH
chmod -R 440 $PATH
fi
Este código funciona muy bien con un archivo con finales de línea UNIX. Sin embargo, con un archivo de texto formateado en Windows, se ahoga miserablemente. La instrucción "echo $PATH" produce la ruta correcta, pero el chmod falla al decir que el archivo no existe. Mi habilidad es que los finales de línea de Windows no se recortan, por lo que intento modificar una ruta de archivo que incluya un carácter de nueva línea.
Necesito hacer que esto funcione independientemente de si el archivo de destino se creó con nuevas líneas de Unix o Windows, pero dado que soy algo nuevo en los scripts de shell, no estoy tan seguro de cómo hacerlo.
¡Aprecio tu ayuda!
Respuesta1
Parece que solo necesitas eliminar el retorno de carro al procesar cada línea. La manera realmente fácil es usar la dos2unix
utilidad, pero si su sistema no la tiene o no puede obtenerla, puede lograr cosas similares con tr
, por ejemplo:
echo $PATH | tr -d '\r'
Más ideas, como usar sed
, están disponibles en elWikipediaentrada.
EDITAR: Debo señalar que $PATH
no es un buen nombre de variable, ya que sin duda lo establece el entorno y otros programas pueden depender de su valor. Deberías considerar cambiarlo a algo como $CUR_PATH
.
Respuesta2
Simplemente cambiaría la primera línea del script:
CONTENT=$(tr -d \\r < /path/to/text/file.txt)