GNU/Linux >> Linux の 問題 >  >> Linux

Bashで2つ以上の可変文字列を連結した後、文字列が欠落していますか?

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を切り捨てます。


Linux
  1. &&および||後のBashラインの継続文書化されていますか?

  2. Bash で、ファイルの各行の後に文字列を追加するにはどうすればよいですか?

  3. Bashでドット区切りバージョン形式の2つの文字列を比較するには?

  1. grep を使用して 1 行に 2 つの文字列を一致させる

  2. bash スクリプトに少なくとも 2 つの引数が指定されていることを確認します

  3. bash の改行でテキストをエコーする

  1. 変数を使用してBashを使用して複数行の文字列を記述する方法は?

  2. シェルスクリプト、メッセージをエコーし​​た後に同じ行で読む

  3. 一致するテキストを見つけて次の行を置き換える