Ketika saya menjalankan dua while loop dan mencoba menggabungkan dua string variabel (dari dua loop), hasil akhir (string) aneh. Saya telah mencoba berbagai cara untuk menggabungkan tetapi tidak mendapatkan jawabannya:Di bawah ini adalah kodenya:
[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
Di varlists.txt
var1
var2
Di model_test1.txt
My_model1
My_model2
Setelah menjalankan skrip, itu menunjukkan
Working on model - My_model1
and model number = 1
*.ncm_My_model1
*.ncm_My_model1
******************************************
Jawaban yang Diterima:
File teks Anda memiliki akhiran baris Windows/DOS CRLF.
String digabungkan dengan benar, tetapi byte carriage return ditinggalkan di akhir vname
dan mname
, karena itu bukan bagian dari baris yang diakhiri dengan Unix dan karenanya tidak digunakan oleh read
. Saat Anda mencetak string, tampilan malah hancur. Carriage return menggeser kursor kembali ke awal baris (seperti mesin tik), membiarkan teks ditimpa.
Saat Anda mencetak beberapa teks dengan carriage return di dalamnya, teks hingga CR muncul seperti biasa, lalu kursor keluaran bergerak kembali ke awal, dan kemudian bagian string selanjutnya dicetak di atas bagian sebelumnya. Itu sebabnya “*.nc
” muncul di awal baris dalam keluaran yang dilaporkan meskipun “${extn}
” terakhir – mname
diakhiri dengan carriage return.
Anda dapat menjalankan file teks Anda melalui dos2unix
untuk menghapus byte carriage return ekstra. Anda juga dapat menggunakan ${vname%$'r'}
dalam skrip untuk memotong CR tambahan jika Anda tidak ingin atau tidak dapat mengubah file.