【问题标题】:How do I append to an existing string variable inside a loop in bash?如何在 bash 的循环中附加到现有的字符串变量?
【发布时间】:2013-10-30 23:57:51
【问题描述】:

我有一个简单的 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 的说法,脚本没有任何问题,我认为我正确地关注了this answerThis 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

【问题讨论】:

  • 我认为您所看到的是curl 没有得到谷歌的股票价格。您是否在循环中呼应股票和价格作为调试措施?如果第二种技术不能正常工作,那么问题出在数据上。第一个也应该可以,但是...
  • @JonathanLeffler 看起来curl 正在获取数据。见编辑;我回应了股票和价格,并且数据被正确获取。

标签: bash


【解决方案1】:

当我运行您的脚本并将输出通过管道传输到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')

【讨论】:

  • 我不知道od 命令,这非常有用!谢谢!
【解决方案2】:

我很确定问题在于 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-04
    • 1970-01-01
    相关资源
    最近更新 更多