Bash에서 두 개 이상의 변수 문자열을 연결한 후 문자열이 손실되었습니다.

Bash에서 두 개 이상의 변수 문자열을 연결한 후 문자열이 손실되었습니다.

두 개의 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
******************************************

답변1

텍스트 파일에 Windows/DOS CRLF가 있습니다.줄 끝.

문자열 연결은 정확하지만 캐리지 리턴 바이트는 Unix의 끝 줄의 일부가 아니므로 모두 사용되지 않기 때문에 vname합계 끝에 남습니다 . 문자열을 인쇄하면,mnameread전시하다그러나 그것은 파괴되었습니다. Enter 키를 누르면 커서가 줄의 시작 부분으로 다시 이동하여(타자기와 마찬가지로) 텍스트를 덮어쓸 수 있습니다.

캐리지 리턴을 사용하여 일부 텍스트를 인쇄하면 CR까지의 텍스트가 정상적으로 표시된 다음 출력 커서가 처음으로 다시 이동하고 문자열의 뒷부분이 이전 부분 위에 인쇄됩니다. 이것이 바로 " " 가 캐리지 리턴으로 끝나는 마지막 줄 *.nc임에도 불구하고 보고서 출력의 줄 시작 부분에 나타나는 이유입니다.${extn}mname

텍스트 파일을 실행하여 dos2unix추가 캐리지 리턴 바이트를 제거할 수 있습니다. ${vname%$'\r'}스크립트에서 사용할 수도 있습니다.자르기뒤따라CR파일을 수정하고 싶지 않거나 수정할 수 없는 경우.

관련 정보