GNU/Linux >> Znalost Linux >  >> Linux

Chybí struny po zřetězení dvou nebo více proměnných řetězců v bash?

Když spouštím dvě smyčky while a pokouším se zřetězit dva proměnné řetězce (ze dvou smyček), konečný výstup (řetězec) je divný. Zkoušel jsem jiný způsob zřetězení, ale nedostal jsem odpověď:Níže je kód:
[Potřebuji 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

V souboru varlists.txt

var1
var2

V model_test1.txt

My_model1
My_model2

Po provedení skriptu se zobrazí

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

Přijatá odpověď:

Vaše textové soubory mají Windows/DOS zakončení řádků CRLF.

Řetězce se zřetězují správně, ale bajt pro návrat vozíku je ponechán na konci vname a mname , protože není součástí řádku končícího na Unixu, a tak nebyl spotřebován read . Když řetězec vytisknete, zobrazí se je místo toho rozbitý. Carriage returns posune kurzor zpět na začátek řádku (jako psací stroj), čímž umožní přepsání textu.

Když vytisknete nějaký text s návratem vozíku, text až po CR se zobrazí jako normálně, poté se výstupní kurzor přesune zpět na začátek a později se části řetězce vytisknou přes horní část dřívějších částí. To je důvod, proč „*.nc “ se objeví na začátku řádku ve vašem nahlášeném výstupu, i když „${extn} ” je last – mname končí návratem vozíku.

Své textové soubory můžete spouštět prostřednictvím dos2unix k odstranění nadbytečných bajtů návratu vozíku. Můžete také použít ${vname%$'r'} ve skriptu zkrátit koncové CR, pokud nechcete nebo nemůžete upravovat soubory.


Linux
  1. Jak v Bash přidám řetězec za každý řádek v souboru?

  2. Jak porovnat dva řetězce ve formátu verze oddělené tečkami v Bash?

  3. Spojte dva řetězce v jednom řádku s grep

  1. Zkontrolujte, zda jsou ve skriptu bash uvedeny alespoň dva argumenty

  2. Shell Script, čtěte na stejném řádku po ozvěně zprávy

  3. najít odpovídající text a nahradit další řádek

  1. Použití odkazu na proměnnou bashového řetězce v Sed?

  2. Převeďte textový řetězec v bash na pole

  3. bash skript připojí text k prvnímu řádku souboru