Quando eseguo due cicli while e provo a concatenare due stringhe variabili (da due cicli), l'output finale (stringa) è strano. Ho provato un modo diverso per concatenare ma non ho ottenuto la risposta:Di seguito è riportato il codice:
[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
Dopo aver eseguito lo script, viene visualizzato
Working on model - My_model1
and model number = 1
*.ncm_My_model1
*.ncm_My_model1
******************************************
Risposta accettata:
I tuoi file di testo hanno terminazioni di riga CRLF di Windows/DOS.
Le stringhe si concatenano correttamente, ma il byte di ritorno a capo viene lasciato alla fine di vname
e mname
, perché non fa parte di una riga che termina su Unix e quindi non è stato utilizzato da read
. Quando stampi la stringa, il display è invece maciullato. I ritorni a capo riportano il cursore all'inizio della riga (come una macchina da scrivere), lasciando che il testo venga sovrascritto.
Quando si stampa del testo con un ritorno a capo, il testo fino al CR viene visualizzato normalmente, quindi il cursore di output torna all'inizio e quindi le parti successive della stringa vengono stampate sopra le parti precedenti. Ecco perché "*.nc
” appare all'inizio della riga nell'output segnalato anche se “${extn}
” è l'ultimo – mname
termina con un ritorno a capo.
Puoi eseguire i tuoi file di testo tramite dos2unix
per rimuovere i byte di ritorno a capo extra. Puoi anche usare ${vname%$'r'}
nello script per troncare i CR finali se non vuoi o non puoi modificare i file.