2つのwhileループを実行していて、(2つのループからの)2つの変数文字列を連結しようとすると、最終的な出力(文字列)がおかしくなります。別の方法で連結しようとしましたが、答えが得られませんでした。コードは次のとおりです。
[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/DOSCRLFです。
文字列は正しく連結されていますが、キャリッジリターンバイトはvname
の最後に残っています。 およびmname
、Unixで終わる行の一部ではないため、read
によって使い果たされなかったためです。 。文字列を印刷すると、表示 代わりにマングルされます。キャリッジリターンは、カーソルを行の先頭に戻し(タイプライターのように)、テキストを上書きできるようにします。
キャリッジリターンを含むテキストを印刷すると、CRまでのテキストが通常どおり表示され、出力カーソルが最初に戻り、文字列の後の部分が前の部分の上に印刷されます。そのため、「*.nc
「${extn}
」は、レポートされた出力の行の先頭に表示されます。 」が最後です– mname
キャリッジリターンで終了します。
dos2unix
を介してテキストファイルを実行できます 余分なキャリッジリターンバイトを削除します。 ${vname%$'r'}
を使用することもできます スクリプトで、ファイルを変更したくない、または変更できない場合に、後続のCRを切り捨てます。