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 sithen
no estuviera allí. -
myscript: line 6: syntax error: unexpected end of file
, como sifi
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
.