it-swarm.com.de

Warum erhalte ich "Zeile 1: $ ': \ r': Befehl nicht gefunden"?

Ich habe Cygwin auf meinem Laptop (DOS) verwendet. Ich habe eine Sammlung von Skripten meiner Kollegen und meiner eigenen. Ich bin keine IT-Person und kenne mich mit Unix nicht aus. Ich folge der Syntax meiner Kollegen und kann ein paar einfache Dinge verwalten.

Die Skripte funktionierten gut auf meinem alten Laptop. Ich habe gerade den Laptop gewechselt und Cygwin installiert. Wenn ich meine Skripte ausführe, funktionieren sie nicht. Hier ist ein Beispiel für die Fehlermeldung, die ich erhalte:

line 1: $':\r': command not found
line 5: syntax error near unexpected token `$'\r''
line 5: `fi

Hier sind die obersten 5 Zeilen meines Skripts

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt 
fi  

Kann mir bitte jemand erklären, wie ich dieses Problem umgehen kann?

13
TPham

Sie haben Zeilenenden im Windows-Stil.

Der No-Op-Befehl : Wird stattdessen als :<carriage return> Gelesen und als :\r Oder vollständiger als $':\r' Angezeigt.

Führen Sie dos2unix scriptname Aus, und es sollte Ihnen gut gehen.


Wenn Sie nicht dos2unix Haben, sollte das Folgende fast überall funktionieren (und ich habe es auf MobaXterm unter Windows getestet):

vi -b filename

Geben Sie dann in vi Folgendes ein:

:%s/\r$//
:x

Du bist gut zu gehen.


In vim, das Sie in Cygwin für vi verwenden, gibt es mehrere Möglichkeiten, dies zu tun. Eine andere beinhaltet die Einstellung fileformat, die die Werte dos oder unix annehmen kann. Ändern Sie es entweder explizit nach dem Laden der Datei mit

setze fileformat = unix
: w + Dateiformat = Unix

Weitere Informationen hierzu finden Sie in den zahlreichen Fragen und Antworten zu diesem Thema, darunter:

29
Wildcard

Dies liegt daran, dass das Skript von einem Editor gespeichert wurde, der DOS-Zeilenenden verwendet (z. B. Notepad ++). Sie müssen diese aus Ihren Skripten entfernen.

Verwenden Sie dazu entweder dos2unix In der Skriptdatei oder

$ tr -d '\r' <script >script.new && mv script.new script

(Dadurch werden alle Wagenrückläufe von irgendwo im Skript entfernt.)


Wie für den Code im Skript:

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt 
fi  

Dies sollte möglicherweise so aussehen

iter=1
if [ -f "./$iter.txt" ]; then
   rm "./$iter.txt"
fi

Dadurch wird die Datei 1.txt Aus dem aktuellen Verzeichnis entfernt, sofern vorhanden. Der Befehl : Führt (fast) nichts aus und kann entfernt werden. Der Wert der Variablen iter sollte als $iter Verwendet und in Anführungszeichen gesetzt werden. Und dann bin ich möglicherweise expliziter als nötig, indem ich mit ./ Sage, dass die Datei im aktuellen Verzeichnis gefunden werden muss.

Wenn Sie dies in eine Schleife umwandeln möchten (hier alle Dateien löschen 1.txt, 2.txt, ..., 10.txt):

iter=1
while [ "$iter" -le 10 ]; then
    if [ -f "./$iter.txt" ]; then
        rm "./$iter.txt"
    fi
    iter=$(( iter + 1 ))
done

Oder wenn wir uns hinterhältig/faul fühlen,

rm -f {1..10}.txt

in Muscheln, die die Ausdehnung der Zahnspange verstehen.

10
Kusalananda

Ihre Skripte haben die falschen Zeilenenden. Windows verwendet CR + LF (\ r\n), Unix verwendet LF (\ n)) und Classic MacOS verwendet CR (\ r). Sie müssen die Zeilenenden aktivieren Alle betroffenen Dateien, entweder mit einem Texteditor oder einem eigenständigen Tool wie dos2unix.

FTP- und Versionskontrollsysteme wie SVN sind in der Regel in der Lage, die Zeilenenden entsprechend zu konvertieren. Daher sollten Sie diese Optionen für die zukünftige Übertragung von Dateien prüfen.

Wenn diese Dateien nicht übertragen werden, sondern nur auf einem einzelnen Computer verwendet werden, sollten Sie die Einstellungen für Zeilenenden in Ihrem bevorzugten Texteditor finden. Die meisten, die als "für Programmierer" beworben werden, haben eine solche Option.

5
Fox

Lassen Sie mich als ergänzende Antwort ein paar Anmerkungen/Tipps hinzufügen ...

Erstens können Sie bei normalen Textdateien mit dem Befehl file leicht feststellen, ob sie eine Unix- oder DOS-Zeilenende haben. Zum Beispiel:

$ file test.txt
test.txt: ASCII text, with CRLF line terminators
$ dos2unix test.txt
dos2unix: converting file test.txt to Unix format...
$ file test.txt
test.txt: ASCII text

Beachten Sie meine Verwendung von dos2unix. Ich empfehle Ihnen dringend, es zu installieren. Abhängig davon, wie Sie Cygwin verwenden, müssen Sie diese Konvertierung möglicherweise so oft durchführen, dass die Bequemlichkeit erwünscht ist. Noch wichtiger ist, dass es keine Fehlerwahrscheinlichkeit gibt, wie Sie sie bei den hier beschriebenen manuellen Änderungen erhalten.

Starten Sie zur Installation die ausführbare Cygwin-Hauptdatei. Das ist der mit dem Namen setup-x86_64.exe oder so ähnlich. Stellen Sie sicher, dass Sie einen Bildschirm wie diesen sehen:

(enter image description here

Da Sie die primäre Installation bereits durchgeführt haben, sollten Sie in der Lage sein, bis zum Aufrufen des Auswahlbildschirms auf Weiter zu klicken. Wählen Sie in der Dropdown-Liste Voll aus, geben Sie "dos2" in das Suchfeld ein und wählen Sie das hier gezeigte Werkzeug aus:

(enter image description here

Klicken Sie dann erneut auf Weiter und lassen Sie die Installation abschließen. Das ist es. Habe Spaß. Cygwin ist mit Ausnahme dieser gelegentlichen Unannehmlichkeiten ein großartiges Paket.

3
B Layer

Wenn nicht dos2unix, gibt es auch 'flip'

$ flip -u yourfilename.txt

wird es auf Unix-Zeilenenden umdrehen.

1
chai

Ich benutze Notepad ++, um meine Bash (.sh) -Skripte zu bearbeiten, indem ich über WinSCP eine Verbindung zum Server herstelle
(So richten Sie den WinSCP-Editor für Notepad ++ ein: https://winscp.net/eng/docs/ui_editor_preferences )

Dies ist sehr praktisch, um Dateien von Servern zum Bearbeiten/Speichern anstelle des Editors " Vim" zu öffnen.
Wenn Sie die Datei in Notepad ++ öffnen, doppelklicken Sie auf die 7. Spalte in der Statusleiste unten und wählen Sie " Unix (LF) ".

(enter image description here

Außerdem müssen Sie die 8. durch Codierung -> Codierung in UTF-8 in der oberen Leiste ändern.

1
Alper t. Turker

Sie müssen die tatsächliche Zeilencodierung der Datei nicht ändern, damit Cygwins Bash problemlos mit Mac- und Windows-Zeilenendcodierungen funktioniert. Es gibt eine Option, die Sie nur aktivieren müssen.

Aktualisieren Sie einfach Ihr ~/.bash_profile so enthält es

export SHELLOPTS
set -o igncr

Siehe https://ptolemy.berkeley.edu/projects/chess/softdevel/faq/5.html

0
swdev