GNU/Linux >> Linux Esercitazione >  >> Linux

errore di sintassi vicino al token imprevisto ' - bash

Grazie @jdt per la tua risposta.

Successivamente, e poiché continuo ad avere questo problema con il ritorno a capo, ho scritto quella piccola sceneggiatura. Esegui solo carriage_return e ti verrà chiesto di "pulire" il file.

https://gist.github.com/kartonnade/44e9842ed15cf21a3700

alias carriage_return=remove_carriage_return
remove_carriage_return(){

# cygwin throws error like : 
# syntax error near unexpected token `$'{\r''
# due to carriage return
# this function runs the following
# cat originalfile | tr -d "\r" > newfile

read -p "File to clean ? "
file_to_clean=$REPLY
temp_file_to_clean=$file_to_clean'_'

# file to clean => temporary clean file
remove_carriage_return_one='cat '$file_to_clean' | tr -d "\r" > '
remove_carriage_return_one=$remove_carriage_return_one$temp_file_to_clean

# temporary clean file => new clean file
remove_carriage_return_two='cat '$temp_file_to_clean' | tr -d "\r" > '
remove_carriage_return_two=$remove_carriage_return_two$file_to_clean

eval $remove_carriage_return_one
eval $remove_carriage_return_two
# remove temporary clean file 
eval 'rm '$temp_file_to_clean

}


Potrebbe trattarsi di un problema di codifica del file.

Ho riscontrato problemi di codifica del tipo di file lavorando su file tra diversi sistemi operativi ed editor, nel mio caso in particolare tra sistemi Linux e Windows.

Suggerisco di controllare la codifica del tuo file per assicurarti che sia adatto all'ambiente Linux di destinazione. Immagino che un problema di codifica sia meno probabile dato che stai utilizzando un MAC piuttosto che se avessi utilizzato un editor di testo Windows, tuttavia penso che valga comunque la pena considerare la codifica dei file.

--- EDIT (Aggiungi una soluzione reale come raccomandato da @Potatoswatter)

Per dimostrare come la codifica del tipo di file potrebbe essere questo problema, ho copiato/incollato il tuo script di esempio in Blocco note in Windows (non ho accesso a un Mac), quindi l'ho copiato su una macchina Linux e l'ho eseguito:

[email protected]:~/windows> sh ./originalfile             
./originalfile: line 2: syntax error near unexpected token `$'{\r''
'/originalfile: line 2: `test() {

In questo caso, Blocco note ha salvato il file con ritorni a capo e avanzamenti di riga, causando l'errore mostrato sopra. Il \r indica un ritorno a capo (i sistemi Linux terminano le righe con avanzamenti riga \n solo).

Sulla macchina Linux, puoi testare questa teoria eseguendo quanto segue per eliminare i ritorni a capo dal file, se presenti:

cat originalfile | tr -d "\r" > newfile

Poi prova ad eseguire il nuovo file sh ./newfile . Se funziona, il problema era che i ritorni a capo erano caratteri nascosti.

Nota: Questa non è una replica esatta del tuo ambiente (non ho accesso a un Mac), tuttavia mi sembra probabile che il problema sia che un editor, da qualche parte, ha salvato i ritorni a capo nel file.

--- /MODIFICA

Per elaborare un po ', i sistemi operativi e gli editor possono avere diverse impostazioni predefinite di codifica dei file. In genere, le applicazioni e gli editor influenzeranno la codifica del tipo di file utilizzata, ad esempio, penso che Microsoft Notepad e Notepad ++ siano predefiniti su Windows-1252. Potrebbero esserci anche differenze di nuova riga da considerare (negli ambienti Windows, un ritorno a capo e un avanzamento riga vengono spesso utilizzati per terminare le righe nei file, mentre in Linux e OSX viene solitamente utilizzato solo un avanzamento riga).

Una domanda e risposta simile che fa riferimento alla codifica dei file è qui:cattivo carattere visualizzato nell'esecuzione dello script bash


prova qualcosa come

$ sudo apt-get install dos2unix
$ dos2unix offendingfile

Modo semplice per convertire example.sh file in UNIX se stai lavorando in Windows è usare NotePad++ (Modifica>Conversione EOL>Formato UNIX/OSX)

Puoi anche impostare l'EOL predefinito in notepad++ (Impostazioni>Preferenze>Nuovo documento/Directory predefinita>seleziona Unix/OSX nella casella Formato)


Linux
  1. Scopri la gestione degli errori di Bash con l'esempio

  2. Come controllare la sintassi di sudoers

  3. Il Bash '?

  4. Operatori logici multipli, ((a || B) &&C) e "Errore di sintassi vicino a token imprevisto"?

  5. Errore Wget bash Sottosistema Windows per Linux

Come leggere un file riga per riga in Bash

Comando sorgente Bash

Bash:aggiungi al file

Sostituzione di String in Bash

35 Esempi di script Bash

Scripting Bash(III)