두 개의 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
합계 끝에 남습니다 . 문자열을 인쇄하면,mname
read
전시하다그러나 그것은 파괴되었습니다. Enter 키를 누르면 커서가 줄의 시작 부분으로 다시 이동하여(타자기와 마찬가지로) 텍스트를 덮어쓸 수 있습니다.
캐리지 리턴을 사용하여 일부 텍스트를 인쇄하면 CR까지의 텍스트가 정상적으로 표시된 다음 출력 커서가 처음으로 다시 이동하고 문자열의 뒷부분이 이전 부분 위에 인쇄됩니다. 이것이 바로 " " 가 캐리지 리턴으로 끝나는 마지막 줄 *.nc
임에도 불구하고 보고서 출력의 줄 시작 부분에 나타나는 이유입니다.${extn}
mname
텍스트 파일을 실행하여 dos2unix
추가 캐리지 리턴 바이트를 제거할 수 있습니다. ${vname%$'\r'}
스크립트에서 사용할 수도 있습니다.자르기뒤따라CR파일을 수정하고 싶지 않거나 수정할 수 없는 경우.