TL;DR: Your script has Windows style CRLF line endings, aka
.
Convert to Unix style
by deleting the carriage returns.
How do I check if my script has carriage returns?
They're detectable as ^M
in the output of cat -v yourscript
:
$ cat -v myscript
if true^M
then^M
true^M
...
How do I remove them?
Set your editor to save the file with Unix line endings, aka "line terminators" or "end-of-line characters", and resave it.
You can also remove them from a command line with dos2unix yourscript
or cat yourscript | tr -d '
' > fixedscript
.
Why do carriage returns cause syntax errors?
The carriage return character is just another character to bash. then
is not the same as then
, so bash doesn't recognize it as a keyword and assumes it's a command. It then keeps looking for a then
and fails
If there happens to be a trailing space after then
, you get a similar problem for fi
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…