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

第二个脚本给出了同样的结果:

 GOOG: 1030.42
 AAPL: 524.896
 AAPL: 524.896
4

2 回答 2

5

我很确定问题在于 curl 正在返回一个回车符,这会弄乱两个值的打印。如果你将 curl 命令的输出重定向到一个文件并在 vi 中查看它,你会看到它创建了一个 DOS 文件。

这似乎有效:

#!/bin/bash

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

echo -e "$output"
于 2013-10-31T00:20:11.317 回答
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 字符(\r在 od 输出中),这导致它们在打印字符串时相互重叠打印。

您可以通过管道输出curltotr -d '\r'以去除有问题的 CR:

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