строки отсутствуют после конкатенирования двух или более переменных строк в bash

Когда я запускаю цикл while while и пытаюсь конкатенировать две переменные строки (из двух циклов), конечный вывод (строка) является странным. Я пробовал другой способ конкатенации, но не получил ответа: Ниже приведен код: [Мне нужно 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 

В файле varlists.txt

 var1 var2 

В файле model_test1.txt

 My_model1 My_model2 

После выполнения скрипта он показывает

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

В ваших текстовых файлах заканчиваются линии Windows / DOS CRLF.

Строки конкатенируются правильно, но байт возвращаемого байта остается в конце vname и mname , потому что он не является частью строки, заканчивающейся в Unix, и поэтому не использовался при read . Когда вы печатаете строку, вместо этого отображается искажение. Возврат каретки возвращает курсор назад к началу строки (например, пишущей машинке), позволяя переписать текст.

Когда вы печатаете какой-то текст с возвратом каретки, текст до CR отображается как обычно, тогда курсор вывода возвращается к началу, а затем более поздние части строки печатаются поверх предыдущих частей. Вот почему « *.nc » появляется в начале строки в вашем сообщении, даже если « ${extn} » – last – mname заканчивается возвратом каретки.

Вы можете запускать текстовые файлы с помощью dos2unix чтобы удалить лишние байты возврата каретки. Вы также можете использовать ${vname%$'\r'} в сценарии, чтобы обрезать конечные CR, если вы не хотите или не можете изменять файлы.