Perché uno script di shell dà errori di syntax quando lo stesso codice funziona altrove?

Ho un semplice script di shell che ho copiato da uno script funzionante. Funziona se lo copio e lo incollo su un terminale:

if true then true fi 

Tuttavia, quando eseguo lo script con bash myscript , ottengo vari errori di syntax come se mancassero alcune parole chiave.

  • myscript: line 4: syntax error near unexpected token `fi' , come se then non ci fosse.
  • myscript: line 6: syntax error: unexpected end of file , come se fi non fosse presente.
  • myscript: line 4: syntax error near unexpected token `$'\r' .. cosa?

Perché questo accade in questo particolare script, ma non sulla mia linea di comando o nello script da cui ho copiato?

TL; DR: lo script ha terminazioni di riga CRLF in stile Windows, ovvero \r\n .

Converti in stile Unix \n eliminando i ritorni a capo.


Come posso verificare se il mio script ha ritorni a capo?

Sono rilevabili come ^M nell’output di cat -v yourscript :

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

Come li rimuovo?

Imposta il tuo editor per salvare il file con terminazioni di linea Unix, ovvero “terminatori di riga” o “caratteri di fine riga” e salvalo nuovamente.

Puoi anche rimuoverli da una riga di comando con dos2unix yourscript o cat yourscript | tr -d '\r' > fixedscript cat yourscript | tr -d '\r' > fixedscript .

Perché i ritorni a capo causano errori di syntax?

Il carattere di ritorno a capo è solo un altro personaggio da colpire. then non è lo stesso di then\r , quindi bash non lo riconosce come parola chiave e assume che si tratti di un comando. Continua quindi a cercare un then e fallisce

Se dopo di ciò si verifica uno spazio finale, si ottiene un problema simile per fi .