bashを使用してファイルの行を繰り返し、変数に渡します。結果変数がファイル値と異なります。なぜですか?

bashを使用してファイルの行を繰り返し、変数に渡します。結果変数がファイル値と異なります。なぜですか?

私は長年にわたってcronで実行してきたbashスクリプト(単純なログファイルパターンマッチングを実行しました)を持っています。最近問題が発生し、奇妙な結果が返り始めました。スクリプトを詳しく見てデバッグをした後、ファイルで実行していたwhileループに問題があるようだという事実を発見しました。

問題を説明するために、 "cat /var/tmp/file"ファイルを分類し、予想されたタイムスタンプといくつかの(フォーマットされていない)IDを取得しました。

15:56:14,965 [,PCC12345678(PSI12345678),,]
18:08:43,706 [,PCC23456789(PSI23456789),,]
12:01:49,233 [,PCC34567891(PSI34567891),,]

whileループに入れても同じままになると予想していましたが、そうではありません。ループ内でその行をエコーすると、2番目のフィールド(ID)は常に次のように「1」に変わります。

cat /var/tmp/file | while read line
do
echo $line
done

私に提供される結果は次のとおりです。

15:56:14,965 1
18:08:43,706 1
12:01:49,233 1

これは明らかにファイルの内容とまったく異なるため、混乱しています。

これまでに試したこと:

  • $line変数がメモリに閉じ込められている可能性があると思って消去しようとしましたが、成功しませんでした。
  • より良いアイデアがないので、サーバーを「オフにして再びオンにする」方法を試してみました。それで、詰まる可能性のあるすべての問題が解決されると思いました。
  • 他の2つのサーバーでスクリプトを実行してみましたが、同じ問題が発生しました。

現在、私はファイル形式が気に入らないかもしれませんし、角かっこやカンマに関連するものかもしれないと思います。なぜこのようなことが起こるのか、なぜ突然このようなことが起こるのかはよくわかりません。

注:作成された後、スクリプトまたはスクリプトが実行されるログファイルは変更されませんでした。以前は2年間働いてきました。

編集:提案されているように、環境に可能な変化があることを確認しましたが、私が知っている限り、状況は同じです。 OSのアップグレードで変更がない場合(確認方法がわかりません):

  • .bash_profileと.profileは3年以上編集されていません。
  • 別のシェルksh、bash、cshでスクリプトを実行してみました。彼らはすべて同じ問題に直面しました。
  • 他のユーザー(ルートを含む)と一緒にスクリプトを実行してみました。それらのすべてはまた同じ問題を経験しました。

ありがとうマット

ベストアンサー1

1スクリプトが実行されるディレクトリにファイル名があります。

〜のようにメル・バスランドコメントは[]シェルで特別な意味を持ちますが、正規表現とはあまり関係ありません。単に「角かっこの間のすべての文字からの単一文字」を意味するだけです。だからあなたが走るとき

echo 15:56:14,965 [,PCC12345678(PSI12345678),,]

,シェルは、、またはPCまたは...という名前のファイルを探し1、1つ以上のファイルが一致すると、[,PCC12345678(PSI12345678),,]出力に一致するすべてのファイル名に置き換えます。それ以外の場合はそのままコピーされます。

このファイルを削除すると、1以前の動作が復元されるはずです。スクリプトを保護して変更できます$line

cat /var/tmp/file | while read line
do
echo "$line"
done

おすすめ記事