web-dev-qa-db-de.com

bash-Datei gibt unerwartetes Token "$" do\r "zurück

Ich habe dieses Skript online gefunden und versucht, es zu verwenden:

#!/bin/sh
# Target directory
TARGET=$3
echo "Copying to $TARGET"
for i in $(git diff --name-only $1 $2)
    do
        # First create the target directory, if it doesn't exist.
        mkdir -p "$TARGET/$(dirname $i)"
        # Then copy over the file.
        cp "$i" "$TARGET/$i"
    done
echo "Done";

Ich habe das Skript online validiert und das Skript ist in Ordnung. Ich habe auch versucht, es auf verschiedene Arten zu ändern, aber es funktioniert bei mir nicht.

Ich habe auch versucht, etwas wie:

#!/bin/sh
# Target directory
TARGET=$3
echo "Copying to $TARGET"
for i in $(ls)
do
    echo "text"
done

Und ich bekomme immer noch den gleichen Fehler:

./git-copy.sh: line 6: syntax error near unexpected token `$'do\r''
'/git-copy.sh: line 6: `do

Warum das?

9
kfirba

Ihr Skript wurde auf einem DOS- oder Windows-basierten System bearbeitet und enthält Wagenrücklaufzeichen, die Linux/Unix nicht gefallen (das, was \r ist). Sie können dos2unix verwenden, um die Zeilenenden des Wagenrücklaufs in das richtige Format zu konvertieren. Wenn Sie keinen dos2unix haben, können Sie awk wie verwenden

awk '{ sub("\r$", ""); print }' git-copy.sh > git-copy2.sh
mv git-copy2.sh git-copy.sh
21
Elliott Frisch

Eine weitere mögliche Lösung mit dem Unix-Texteditor vi:

öffne die Datei in vi edit mit dem Befehl vi filename.sh;

geben Sie den Befehl vi :set ff=unix ein.

datei speichern mit :wq

Die Datei wird mit Unix-Zeilenenden gespeichert.

21
Bfcm

Das hat bei mir funktioniert:

dos2unix my_script.sh

Wenn Sie dos2unix nicht haben:

So installieren Sie dos2unix unter CentOS, Fedora oder RHEL:

$ Sudo yum install dos2unix

So installieren Sie dos2unix unter Ubuntu oder Debian:

$ Sudo apt-get install tofrodos
$ Sudo ln -s /usr/bin/fromdos /usr/bin/dos2unix 

HTH

3
JRichardsz

Dies ist ein ziemlich häufiger Albtraum :)

Ich habe ein Skript erstellt, um \r\n von Dos und von einem (alten) Mac zu normalisieren. Es entfernt auch die Stückliste, falls vorhanden:

#!/usr/bin/Perl -pi
s/\012\r|\r\012|\012|\r/\012/g;            ## normalize line endings
s/^(\xFF\xFE|\xFE\xFF|\xEF\xBB\xBF)//;     ## remove common initial BOM

Verbrauch: script textualfile*

Ok, ok: Wähle einen besseren Namen dafür! chmod und installiere es

2
JJoao

Ich hatte einen Fall, in dem ein Feld mit einem solchen Bash-Skript (in der Windows-Version von Intellij Idea) in DB geschrieben (INSERT) werden musste, und dann musste ich das Skript auf dem Unix-Server wieder aus DB auslesen. Unter Unix habe ich den Fehler $'do\r'' dieses Themas aus dem oben erläuterten Grund erhalten.

Die Lösung war: Kopieren/Einfügen eines Skripts unter Windows in den Editor, Ändern der Unix-Zeilenenden im Editor von Windows (CR LF) in Unix (LF), Speichern in einer Datei. Öffnen Sie die Datei, kopieren Sie sie und fügen Sie sie in die Datenbankkonsole von Idea ein. Dann hat es unter Unix einwandfrei funktioniert, für den Fall, dass es nicht Origin von Unix war.

(Idea hat auch Optionen, um Zeilenenden in seinem Editor auszuwählen.)

0
d0wn

Ändern Sie einfach Ihre Zeilenfolge in Ihrem Texteditor von CRLF zu LF. Es hat bei mir funktioniert :)

0
Cookie