
Ich habe versucht, die native Bash-String-Manipulation zum Ersetzen von Strings durch meine Shell-Variablen zu verwenden.
var1='123'
var2='2018-01-01'
var3='2018-01-02'
var4='myfunction('var1','var2','var3')'
var5=${var4/var1/$var1}
echo $var5
var5=${var5/var2/$var2}
echo $var5
var5=${var5/var1/$var3}
echo $var5
Erwartete Ausgabe:
myfunction('123','var2','var3')
myfunction('123','2018-01-01','var3')
myfunction('123','2018-01-01','2018-01-02')
Tatsächliche Ausgabe mit durcheinandergeratenen Zeichenfolgen:
myfunction('123','var2','var3')
myfunction('123','2018-01-01','var3')
')function('123','2018-01-01','2018-01-02
Hier verschieben sich die letzten beiden Zeichen an den Anfang und ich verliere die ersten beiden Zeichen der Zeichenfolge. Ich kann SED dafür verwenden. Aber ich versuche nur herauszufinden, warum die native Zeichenfolgenmanipulation von Bash nicht wie erwartet funktioniert. Liegt es daran, dass ich mehrere Ersetzungen vornehme?
Vielen Dank für Ihre Hilfe.
Antwort1
Am Ende des Inhalts steht ein Wagenrücklaufzeichen (CR) var3
. Nachdem es ohne unmittelbar folgendes Zeilenumbruchzeichen (Line Feed, LF) gedruckt wurde, wird der verbleibende Teil der Zeile vom linken Rand aus gedruckt und überschreibt dabei den bereits gedruckten Zeilenanfang.
Der Unix-Standard für das Zeilenende ist LF, nicht CR LF.
Schreiben Sie die Skriptzeile neu, in der die Variable definiert ist, oder verwenden Sie sie dos2unix
in der Datei.