3

株価をダウンロードして変数に追加し、出力する単純な bash スクリプトがあります。

#!/bin/bash

output=" "
for stock in GOOG AAPL
do
  price=$(curl -s "http://download.finance.yahoo.com/d/quotes.csv?s=$stock&f=l1")
  output+="$stock: $price "
done

echo "$output"

このスクリプトは AAPL: 524.896、フェッチされた最後のデータのみを表示します。whatswrongwithmyscriptによると、スクリプトに問題はなく、この回答を適切に実行していると思いました。この回答では、同様の問題(ループ内の文字列変数への追加)について説明し、次のように使用した別の方法を提案しました。

#!/bin/bash

output=" "
for stock in GOOG AAPL
do
  price=$(curl -s "http://download.finance.yahoo.com/d/quotes.csv?s=$stock&f=l1")
  output="$output$stock: $price "
done

echo "$output"

出力はまだ同じです。debian jessie x64でbash 4.2.45を使用しています。

より詳しい情報

結果をループでエコーしてデバッグしたところ、最初のスクリプトから次のようになりました。

 GOOG: 1030.42
 AAPL: 524.896
 AAPL: 524.896

そして、2 番目のスクリプトは同じことを示します。

 GOOG: 1030.42
 AAPL: 524.896
 AAPL: 524.896
4

2 に答える 2

5

スクリプトを実行して出力を にパイプするとod -c、結果が明るくなります。

0000000       G   O   O   G   :       1   0   3   0   .   4   2  \r    
0000020   A   A   P   L   :       5   2   4   .   8   9   6  \r      \n
0000040

したがって、実際にはすべてのエントリを取得して連結していることがわかりますが、CR 文字 ( \rod 出力内) も取得しているため、文字列を印刷するときにそれらが互いに重なって印刷されます。

curltoの出力をパイプtr -d '\r'して、問題のある CR を取り除くことができます。

price=$(curl -s "...." | tr -d '\r')
于 2013-10-31T00:25:31.213 に答える