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.