GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Strings fehlen nach dem Verketten von zwei oder mehr variablen Strings in Bash?

Wenn ich zwei While-Schleife ausführe und versuche, zwei variable Strings (aus zwei Schleifen) zu verketten, ist die endgültige Ausgabe (String) seltsam. Ich habe verschiedene Wege zum Verketten versucht, aber keine Antwort erhalten:Unten ist der Code:
[I need vfile="var1_Amon_My_model1*.nc" ]

#!/bin/bash
jcount=1
extn="*.nc"
while read line
do
mname=$line
echo " Working on model - " $mname
echo " and model number = "$jcount
while read line
do
vname=$line
vfile="${vname}""_Anom_""${mname}""${extn}"
echo $vfile
done<varlists.txt
echo "******************************************"
jcount=$((jcount+1))
done<model_test1.txt

In varlists.txt

var1
var2

In model_test1.txt

My_model1
My_model2

Nach dem Ausführen des Skripts wird angezeigt

 Working on model -  My_model1
 and model number = 1
*.ncm_My_model1
*.ncm_My_model1
******************************************

Akzeptierte Antwort:

Ihre Textdateien haben Windows/DOS-CRLF-Zeilenenden.

Die Zeichenfolgen werden korrekt verkettet, aber das Carriage-Return-Byte bleibt am Ende von vname und mname , weil es nicht Teil einer Zeile ist, die unter Unix endet, und daher nicht von read verbraucht wurde . Wenn Sie die Zeichenfolge ausdrucken, wird die Anzeige wird stattdessen verstümmelt. Carriage Returns verschieben den Cursor zurück zum Anfang der Zeile (wie bei einer Schreibmaschine), wodurch Text überschrieben werden kann.

Wenn Sie einen Text mit einem Wagenrücklauf drucken, wird der Text bis zum CR normal angezeigt, dann bewegt sich der Ausgabecursor zurück zum Anfang, und spätere Teile der Zeichenfolge werden über die früheren Teile gedruckt. Deshalb ist die Datei „*.nc “ erscheint am Anfang der Zeile in Ihrer gemeldeten Ausgabe, obwohl „${extn} “ ist das letzte – mname endet mit einem Wagenrücklauf.

Sie können Ihre Textdateien über dos2unix ausführen um die zusätzlichen Carriage-Return-Bytes zu entfernen. Sie können auch ${vname%$'r'} verwenden im Skript, um abschließende CRs abzuschneiden, wenn Sie die Dateien nicht ändern möchten oder können.


Linux
  1. Bash-Zeilenfortsetzungen nach &&und || Dokumentiert?

  2. Echotext nach Curl-Befehl in derselben Zeile?

  3. Wie füge ich in Bash nach jeder Zeile in einer Datei eine Zeichenfolge hinzu?

  4. Vergleichen Sie zwei Zeichenfolgen in einer Zeile mit grep

  5. Shell-Skript, nach dem Echo einer Nachricht in derselben Zeile lesen

Verwenden von more zum Anzeigen von Textdateien in der Linux-Befehlszeile

Bash Strings verketten

So verwenden Sie bash if -z und if -n zum Testen von Zeichenfolgen in Linux

Verwenden einer Referenz auf eine Bash-String-Variable in Sed?

Bash-Skript zum Zentrieren von Fortune/Text von Stdin/Pipe?

Echotext mit neuer Zeile in Bash