Ich bin neu im Shell-Skript. Ich beziehe eine Datei, die in Windows erstellt wurde und mit dem Befehl source
Wagenrücklauf ausführt. Nachdem ich, wenn ich einige Zeichen anhebe, quelle, kommt es immer an den Anfang der Zeile.
test.dat
(mit Wagenrücklauf am Ende):
testVar=value123
testScript.sh
(Quellen oberhalb der Datei):
source test.dat
echo $testVar got it
Die Ausgabe, die ich bekomme, ist
got it23
Wie kann ich den '\r'
aus der Variablen entfernen?
eine andere Lösung verwendet tr
:
echo $testVar | tr -d '\r'
cat myscript | tr -d '\r'
die Option -d
steht für delete
.
Sie können sed wie folgt verwenden:
MY_NEW_VAR=$(echo $testVar | sed -e 's/\r//g')
echo ${MY_NEW_VAR} got it
Versuchen Sie übrigens, einen dos2unix
für Ihre Datendatei zu erstellen.
verwenden Sie diesen Befehl für Ihre Skriptdatei, nachdem Sie sie nach Linux/Unix kopiert haben
Perl -pi -e 's/\r//' scriptfilename
Über Pipe to sed -e 's/[\r\n]//g'
können Sie sowohl Carriage Returns (\r
) als auch Line Feeds (\n
) aus jeder Textzeile entfernen.
für eine reine Shell-Lösung ohne Aufruf eines externen Programms:
NL=$'\n' # define a variable to reference 'newline'
testVar=${testVar%$NL} # removes trailing 'NL' from string
Da die Datei, die Sie als Quelle verwenden, Zeilen mit Zeilenumbrüchen endet, sieht der Inhalt von $testVar
wahrscheinlich folgendermaßen aus:
$ printf '%q\n' "$testVar"
$'value123\r'
(Der $
der ersten Zeile ist die Shell-Eingabeaufforderung; der $
der zweiten Zeile stammt aus der %q
-Formatierungszeichenfolge und gibt $''
quoting an.)
Um den Wagenrücklauf loszuwerden, können Sie die Shell-Parametererweiterung und ANSI-C-Anführungszeichen verwenden (erfordert Bash):
testVar=${testVar//$'\r'}
Was sollte sich ergeben
$ printf '%q\n' "$testVar"
value123