なぜbashスクリプトが機能しなかったのか、キャリッジリターンについて

Conky用の構成ファイルを作成しました。 ルーブルに対するドルとユーロの結論を導き出し、レートのダイナミクスを計算したかったのです。 タスクは難しくないので、すぐにbashスクリプトを作成しました。 私はCBRFのウェブサイトから為替レートを取得することにしました。



スクリプトは次のようになりました。



#!/bin/bash now=`date +%d/%m/%Y` onedayago=`date --date="1 day ago" +%d/%m/%Y` twodayago=`date --date="2 day ago" +%d/%m/%Y` wget -O now.tmp -q "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$now" wget -O onedayago.tmp -q "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$onedayago" wget -O twodayago.tmp -q "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$twodayago" nowk=`cat now.tmp | grep "USD" -A3 | sed -n -e 4p | tr -d "A-Za-z<>/\t'" | sed -es/\,/\./` onedayagok=`cat onedayago.tmp | grep "USD" -A3 | sed -n -e 4p | tr -d "A-Za-z<>/\t" | sed -es/\,/\./` twodayagok=`cat twodayago.tmp | grep "USD" -A3 |sed -n -e 4p | tr -d "A-Za-z<>/\t" ` dinamika=`echo $onedayagok-$nowk | bc` echo $dinamika
      
      







ただし、スクリプトを実行すると、エラーメッセージが表示されました。



(standard_in)1:不正な文字:^ M

(standard_in)1:不正な文字:^ M







問題は何ですか? 変数を個別に表示することにしました。 2行追加:



 echo $nowk echo $onedayagok
      
      





変数の出力は正しかった:







多分ラインエラー
 echo $onedayagok-$nowk
      
      



? この行の出力をコマンドで追加します
 echo $onedayagok-$nowk
      
      











-58.7710のみが出てきました。 59.4452はどこに行きましたか? ここで困難が生じました。 操作結果の出力をファイルに記録することにしました。データを処理した後、> 1.txtおよび> 2.txtを追加しました。つまり、次のようになりました。



 nowk=`cat now.tmp | grep "USD" -A3 | sed -n -e 4p | tr -d "A-Za-z<>/\t" | sed -es/\,/\./ >1.txt` onedayagok=`cat onedayago.tmp | grep "USD" -A3 | sed -n -e 4p | tr -d "A-Za-z<>/\t" | sed -es/\,/\./ >2.txt`
      
      





外観では、すべてが正常であり、数値はファイルに正常に書き込まれました。







彼はさらに奇妙で予想外の問題をさらに研究し始めました。 同じ内容のファイルを自分で作成することにしました。 nanoテキストエディターを使用して、3.txtファイルを作成し、59.4452を入力します。 4.txtファイルに、58.7710と入力します。 スクリプトでは、ファイルからの読み取りを追加します。



 nowk=`cat 3.txt` onedayagok=`cat 4.txt`
      
      





すべてがうまくいきました。 問題が得られたデータにあることが明らかになりました。 2.txtおよび3.txtファイルを分析する必要がありました。 次に、両方のファイルを16進エディターで開き、違いを見つけます。







ファイルはほとんど同じですが、2.txtファイルには0Dが含まれています。 検索エンジンを使用すると、ODは「キャリッジリターン」であることがわかります。 つまり、echo $ onedayagok- $ nowkコマンドでは、onedayagok変数の値が最初に表示され、次に行の先頭から、nowk変数が同じ行に表示されました。つまり、前の変数が上書きされました。 同じ検索エンジンを使用して、「カード」を削除するには、trユーティリティに「\ r」を追加します。つまり、次のようになります。



 nowk=`cat now.tmp | grep "USD" -A3 | sed -n -e 4p | tr -d "A-Za-z<>/\t'\r'" | sed -es/\,/\./` onedayagok=`cat onedayago.tmp | grep "USD" -A3 | sed -n -e 4p | tr -d "A-Za-z<>/\t'\r" | sed -es/\,/\./` twodayagok=`cat twodayago.tmp | grep "USD" -A3 |sed -n -e 4p | tr -d "A-Za-z<>/\t'\r'" ``
      
      









スクリプトは現在動作していると確信しています。 CBRはこれをキャリッジリターンで返します。 それが問題でした。 残念ながら、そのようなニュアンスは教科書やbashの記事では説明されていないため、このような困難が生じる可能性があります。



All Articles