我有一个简单的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}},脚本没有任何问题,我认为我正在正确地关注whatswrongwithmyscript。 this 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
答案 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')