在 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行结尾

字符串连接正确,但回车字节留在vname和的末尾mname,因为它不是 Unix 上结尾的行的一部分,因此没有被 用完read。当你打印字符串时,展示而是被破坏了。回车将光标移回行首(就像打字机一样),让文本被覆盖。

当您打印一些带有回车符的文本时,直到 CR 的文本将正常显示,然后输出光标移回到开头,然后字符串的后面部分将打印在前面部分的顶部。这就是为什么“ *.nc”出现在报告输出中行的开头,即使“ ${extn}”是最后一个 -mname以回车符结尾。

您可以运行文本文件以dos2unix删除多余的回车符字节。您还可以${vname%$'\r'}在脚本中使用截短尾随CR如果您不想或无法修改文件。

相关内容