it-swarm.com.de

syntaxfehler in der Nähe eines unerwarteten Tokens '- bash

Ich habe ein Beispielskript auf meinem Mac geschrieben 

#!/bin/bash
test() {
  echo "Example"
}
test
exit 0

und dies funktioniert gut, wenn Sie Beispiel anzeigen

Wenn ich dieses Skript auf einer RedHat-Maschine ausführe, heißt es

syntaxfehler in der Nähe von unerwartetem Token '

Ich habe überprüft, ob bash verfügbar ist

cat /etc/shells

which bash shows /bin/bash 

Hat jemand das gleiche Problem gefunden?

Danke im Voraus !

12
user3155779

Es könnte ein Problem bei der Dateicodierung sein.

Beim Arbeiten mit Dateien zwischen verschiedenen Betriebssystemen und Editoren sind Probleme mit der Dateitypkodierung aufgetreten - in meinem Fall insbesondere zwischen Linux- und Windows-Systemen.

Ich empfehle Ihnen, die Codierung Ihrer Datei zu überprüfen, um sicherzustellen, dass sie für die Linux-Zielumgebung geeignet ist. Ich denke, ein Kodierungsproblem ist weniger wahrscheinlich, wenn Sie einen MAC verwenden, als wenn Sie einen Windows-Texteditor verwendet hätten. Ich denke jedoch, dass das Kodieren von Dateien immer noch eine Überlegung wert ist.

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

Um zu veranschaulichen, wie die Codierung des Dateityps dieses Problem darstellen kann, habe ich Ihr Beispielskript in Windows in Notepad kopiert/eingefügt (ich habe keinen Zugriff auf einen Mac), kopierte es auf einen Linux-Computer und führte es aus: 

[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 Zeilenumbrüchen und Zeilenvorschüben gespeichert, wodurch der oben gezeigte Fehler verursacht wurde. Der \r zeigt einen Wagenrücklauf an (Linux-Systeme beenden Zeilen nur mit Zeilenvorschub \n). 

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

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

Versuchen Sie dann, die neue Datei sh ./newfile auszuführen. Wenn dies funktioniert, war das Problem Wagenrücklauf als ausgeblendete Zeichen. 

Hinweis: Dies ist keine exakte Replikation Ihrer Umgebung (ich habe keinen Zugriff auf einen Mac), es scheint mir jedoch wahrscheinlich, dass das Problem darin besteht, dass ein Bearbeiter irgendwo einen gespeicherten Wagen in die Datei zurückbringt. 

---/BEARBEITEN 

Betriebssysteme und Editoren können unterschiedliche Standardwerte für die Dateikodierung aufweisen. In der Regel beeinflussen Anwendungen und Editoren die verwendete Dateitypkodierung. Ich denke, Microsoft Notepad und Notepad ++ sind standardmäßig auf Windows-1252 eingestellt. Es können auch Unterschiede in der Zeilenumbrüche auftreten (in Windows-Umgebungen werden Zeilenumbrüche in Dateien häufig mit einem Wagenrücklauf und einem Zeilenvorschub beendet, in Linux und OSX hingegen wird normalerweise nur ein Zeilenvorschub verwendet). 

Eine ähnliche Frage und Antwort, die auf die Dateicodierung verweist, finden Sie hier: schlechtes Zeichen wird bei der Ausführung von Bash-Skripts angezeigt

25
jdt

Wenn Sie unter Windows arbeiten, können Sie example.sh-Datei in UNIX konvertieren, indem Sie NotePad ++ verwenden (Bearbeiten> EOL-Konvertierung> UNIX/OSX-Format).

Sie können die Standard-EOL auch in notepad ++ festlegen (Einstellungen> Voreinstellungen> Neues Dokument/Standardverzeichnis> Wählen Sie Unix/OSX im Feld Format aus.)

4
JAR

versuche etwas wie

$ Sudo apt-get install dos2unix
$ dos2unix offendingfile
4
Amos Folarin

Danke @jdt für deine Antwort.

Im Anschluss daran habe ich dieses kleine Skript geschrieben. Führen Sie nur carriage_return aus und Sie werden aufgefordert, die Datei zu "bereinigen".

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

}

2
kartonnade

Ich möchte zu der obigen Antwort hinzufügen ist , wie zu prüfen ist, ob es sich um ein Problem mit der Rückgabe in einer Unix-ähnlichen Umgebung handelt (ich habe es in MacOS getestet)

1) mit kat

cat -e my_file_name

Wenn Sie sehen, dass die Zeilen mit ^M$ endeten, ist dies das Problem der Rückgabe.

2) Erste Zeile mit Wagenrücklaufzeichen suchen

grep -r $'\r' Grader.sh | head -1

3) Verwenden von vim

vim my_file_name

Geben Sie dann in vim ein

:set ff

Wenn Sie fileformat=dos sehen, stammt die Datei aus einer DOS-Umgebung, die einen Wagenrücklauf enthält.

Nachdem Sie dies herausgefunden haben, können Sie die oben genannten Methoden von anderen Personen verwenden, um Ihre Datei zu korrigieren.

0
traceformula

Ich hatte das gleiche Problem, als ich mit armbian Linux und Windows arbeitete. Ich habe versucht, meine Codes von Windows nach Armbian zu kopieren, und als ich es ausführe, wird dieser Fehler angezeigt. Mein Problem So gelöst: 1. Versuchen Sie, Ihre Dateien mit WinSCP von Windows aus zu kopieren. 2- Stellen Sie sicher, dass Ihr Dateiname keine () Zeichen enthält

0