GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Syntaxfehler nahe unerwartetem Token ' - bash

Danke @jdt für deine Antwort.

Danach, und da ich immer wieder dieses Problem mit Wagenrücklauf habe, habe ich dieses kleine Skript geschrieben. Führen Sie nur carriage_return aus und Sie werden aufgefordert, die Datei zu „säubern“.

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

}


Es könnte ein Problem mit der Dateikodierung sein.

Bei der Arbeit an Dateien zwischen verschiedenen Betriebssystemen und Editoren bin ich auf Probleme mit der Dateitypcodierung gestoßen - in meinem Fall insbesondere zwischen Linux- und Windows-Systemen.

Ich schlage vor, die Kodierung Ihrer Datei zu überprüfen, um sicherzustellen, dass sie für die Ziel-Linux-Umgebung geeignet ist. Ich denke, ein Codierungsproblem ist weniger wahrscheinlich, wenn Sie einen MAC verwenden, als wenn Sie einen Windows-Texteditor verwendet hätten, aber ich denke, die Dateicodierung ist immer noch eine Überlegung wert.

--- BEARBEITEN (Fügen Sie eine tatsächliche Lösung hinzu, wie von @Potatoswatter empfohlen)

Um zu demonstrieren, wie Dateitypcodierung dieses Problem sein könnte, habe ich Ihr Beispielskript in Notepad in Windows kopiert/eingefügt (ich habe keinen Zugriff auf einen Mac), es dann auf einen Linux-Computer kopiert und ausgeführt:

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

In diesem Fall hat Notepad die Datei mit Wagenrückläufen und Zeilenvorschüben gespeichert, wodurch der oben gezeigte Fehler verursacht wurde. Die \r gibt einen Wagenrücklauf an (Linux-Systeme beenden Zeilen mit Zeilenvorschüben \n nur).

Auf dem Linux-Rechner könnten Sie diese Theorie testen, indem Sie Folgendes ausführen, um Wagenrückläufe aus der Datei zu entfernen, falls vorhanden:

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

Versuchen Sie dann, die neue Datei sh ./newfile auszuführen . Wenn dies funktioniert, waren Wagenrückläufe als versteckte Zeichen das Problem.

Hinweis: Dies ist keine exakte Replikation Ihrer Umgebung (ich habe keinen Zugriff auf einen Mac), aber es scheint mir wahrscheinlich, dass das Problem darin besteht, dass ein Editor irgendwo Wagenrückläufe in der Datei gespeichert hat.

--- /BEARBEITEN

Um ein wenig näher darauf einzugehen, können Betriebssysteme und Editoren unterschiedliche Standardeinstellungen für die Dateicodierung haben. Typischerweise beeinflussen Anwendungen und Editoren die verwendete Dateitypcodierung, zum Beispiel denke ich, dass Microsoft Notepad und Notepad++ standardmäßig auf Windows-1252 eingestellt sind. Es können auch Zeilenumbrüche berücksichtigt werden (in Windows-Umgebungen wird häufig ein Wagenrücklauf und ein Zeilenvorschub verwendet, um Zeilen in Dateien abzuschließen, während in Linux und OSX normalerweise nur ein Zeilenvorschub verwendet wird).

Eine ähnliche Frage und Antwort, die sich auf die Dateicodierung bezieht, ist hier:Bad Character Displaying in Bash Script Execution


versuchen Sie so etwas wie

$ sudo apt-get install dos2unix
$ dos2unix offendingfile

Einfache Möglichkeit, example.sh umzuwandeln Datei nach UNIX wenn Sie in Windows arbeiten, verwenden Sie NotePad++ (Bearbeiten>EOL-Konvertierung>UNIX/OSX-Format)

Sie können die Standard-EOL auch in Notepad++ festlegen (Einstellungen>Einstellungen>Neues Dokument/Standardverzeichnis>wählen Sie Unix/OSX im Feld Format)


Linux
  1. Lernen Sie die Bash-Fehlerbehandlung anhand eines Beispiels kennen

  2. So überprüfen Sie die Syntax von Sudoers

  3. Die Bash‘?

  4. Warum enthält die Bash-Übersetzungsdatei nicht alle Fehlertexte?

  5. Tar-Fehler:Unerwartetes EOF im Archiv

So lesen Sie eine Datei Zeile für Zeile in Bash

Bash-Quellbefehl

Bash:An Datei anhängen

Ersetzen von Zeichenfolgen in Bash

35 Bash-Skriptbeispiele

Bash-Scripting(III)