Entfernen Sie "\ r" aus der Ausgabe im Bash-Skript

5

Hier ist mein Bash-Skript, das eine Variable von PHP gesendet wird:

STRING1="/opt/lampp/htdocs/dev/img/$VAR1"
mv $STRING1 "/opt/lampp/htdocs/dev/newlocation/"

Aus irgendeinem Grund wird "\ r" am Ende von $ STRING1 platziert und die Datei kann nicht gefunden werden, da sie die Form "my_picture.jpg \ r" hat.

Jede Hilfe wird geschätzt!

user1062058
quelle

Antworten:

7

Bash geht davon aus, dass das Zeilenende in einem Skript immer und nur ein Newline-Zeichen (\ n) im Unix-Stil ist und keine Wagenrücklauf-Newline-Kombination (\ r \ n) wie unter Windows. Bash glaubt, dass das Zeichen \ r nur ein gewöhnliches Zeichen am Ende der Zeichenfolge ist. (Zeichen, die auf einen String in doppelten Anführungszeichen folgen, werden nur am Ende verkettet.)

Wie Ignacio vorschlägt, besteht die Lösung darin, Ihr Skript so zu reparieren, dass die Zeichen \ r entfernt werden. dos2unixist ein Weg. Eine andere wäre, tr -d '\r' < infile > outfileals Filter zu verwenden.

Nicole Hamilton
quelle
5

dos2unixÜbergeben Sie das Skript , um die Zeilenumbrüche zu korrigieren.

Ignacio Vazquez-Abrams
quelle
2
Wechseln Sie dann zu einem Texteditor, der keine Zeilenenden im DOS-Stil verwendet.
Gordon Davisson
2

Dies ist offensichtlich für andere Googler wie mich, nicht für die OP, da es schon mehr als 5 Jahre her ist. Aber auch diese Lösung gab es damals.

Sie können eine Bash-Ersetzung versuchen, um das größte Muster vom Ende des Strings zu entfernen, das wie $ {varname %% pattern} aussieht. Weitere Informationen finden Sie hier:

http://tldp.org/LDP/abs/html/string-manipulation.html

Es sollte schneller sein, als einen anderen Prozess wie tr zu erzeugen, um damit umzugehen.

VARNAME=$'a_bad_filename\r'
VARNAME="${VARNAME%%[[:cntrl:]]}"

Hier ist eine Referenz für den stark eingeschränkten Bash-Muster-Abgleich (es handelt sich nicht wirklich um einen regulären Ausdruck, sondern eher um einen "like" - oder "glob" -Ausdruck). Ich bin mir nicht sicher, warum der Wagenrücklauf in der Control-Klasse und nicht in der Whitespace-Klasse ist. In anderen Sprachen wird es als Leerraum betrachtet. Ohne die erweiterte Mustererkennung über ein "shopt -s extglob" zu aktivieren, gibt es keine Möglichkeit, ein einfaches Konstrukt wie "this char repeat 0 or more times" in bash anzugeben. Habe ich auch gefunden

printf "%q" "${VARNAME}"

.. zusätzlich zu set -vxzeigen / testen für den Wagenrücklauf.

Ich bin auf dieses Problem gestoßen, als ich Cygwin-Bash gegen die Ausgabe der Standardversion (nicht Cygwin) von Python verwendet habe. Ich bin verwirrt, warum ich nicht mehr sehe, wie ich es lösen soll.

Parität3
quelle
Es funktioniert, wenn ich die Version eines Tools von einem Docker-Image erhalte, großartig
BMW,