bash shell sh carriage-return

bash - ¿Por qué un script de shell da errores de sintaxis cuando el mismo código funciona en otro lugar?



carriage-return (1)

Esta pregunta ya tiene una respuesta aquí:

Tengo un script de shell simple que copié de un script de trabajo. Funciona si lo copio y pego en un terminal:

if true then true fi

Sin embargo, cuando ejecuto el script con bash myscript , obtengo varios errores de sintaxis como si faltaran algunas de las palabras clave.

  • myscript: line 4: syntax error near unexpected token `fi'' , como si then no estuviera allí.
  • myscript: line 6: syntax error: unexpected end of file , como si fi no estuviera allí.
  • myscript: line 4: syntax error near unexpected token `$''/r'' ... ¿qué?

¿Por qué sucede esto en este script en particular, pero no en mi línea de comando o en el script desde el que copié?


TL; DR: su script tiene terminaciones de línea CRLF de estilo Windows, también conocido como /r/n .

Convierta al estilo Unix /n eliminando los retornos de carro.

¿Cómo verifico si mi script tiene retornos de carro?

Son detectables como ^M en la salida de cat -v yourscript :

$ cat -v myscript if true^M then^M true^M ...

¿Cómo los elimino?

Configure su editor para guardar el archivo con finales de línea Unix, también conocidos como "terminadores de línea" o "caracteres de fin de línea", y vuelva a guardarlo.

También puede eliminarlos de una línea de comandos con dos2unix yourscript o cat yourscript | tr -d ''/r'' > fixedscript cat yourscript | tr -d ''/r'' > fixedscript .

¿Por qué los retornos de carro causan errores de sintaxis?

El carácter de retorno de carro es solo otro personaje para golpear. then no es lo mismo que then/r , por lo que bash no lo reconoce como una palabra clave y supone que es un comando. Luego sigue buscando un then y falla

Si después de eso hay un espacio posterior, se obtiene un problema similar para fi .