如何在bash的循环中追加现有的字符串变量?

时间:2013-10-30 23:57:52

标签: bash

我有一个简单的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,即提取的最后一段数据。根据{{​​3}},脚本没有任何问题,我认为我正在正确地关注whatswrongwithmyscriptthis answer讨论了一个类似的问题(在循环中追加一个字符串变量)并提出了一个我用过的不同方法:

#!/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

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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字符(od输出中的\r),这导致它们在彼此的顶部打印当你打印字符串时。

您可以将curl的输出管道传输到tr -d '\r'以去除有问题的CR:

price=$(curl -s "...." | tr -d '\r')