为什么我的脚本中的 unix core utils 无法识别空格?

为什么我的脚本中的 unix core utils 无法识别空格?

我正在写一个简短的脚本来拉动比特币的价格。该信息将通过管道传输到 i3block 中,以便我可以在状态栏上看到每小时的价格 - 这是我到目前为止所拥有的。

#!/bin/bash
price=$(curl -s gbp.rate.sx/btc?T | tail -3 | head -1 | grep -o '[0-9]*' | cut -d ' ' -f1)
echo $price

我计算出比特币价格(以英镑为单位)率.sx使用 T 选项(仅文本,无 ANSI 序列),使用头和尾选择平均价格线并 grep 出数字。输出看起来像这样:

26563 26396 1738 8 6 29

第一个数字是平均价格,其他数字是中位数、变化等...如您所见,我将其通过剪切传递,并以空格作为分隔符,但输出未剪切。

我还尝试将空格替换为“,”以尝试将输出转换为 csv,但这也失败了。

price=$(curl -s gbp.rate.sx/btc?T | tail -3 | head -1 | grep -o '[0-9]*' | sed 's/ /,/' )

上面也给了我相同的输出。为什么要cut努力sed识别空白?

答案1

您自己的管道遇到的问题是您没有意识到输出grep是多个线long,每行一个整数。数字仅在同一行输出,因为您使用了$price不带引号的内容。


如果您想要平均价格,即标签后的金额avg:,那么最简单的方法是awk

curl -s 'https://gbp.rate.sx/btc?T' |
awk '/^avg:/ { print $2 }'

上面的代码awk所做的是打印以 text 开头的每一行中的第二个空格分隔的字段avg:

这会给你类似的东西£26421。如果您想要不带英镑符号的金额,请使用print substr($2,2)代替print $2

您想使用grepandcut来执行此操作,然后执行类似的操作吗

curl -s 'https://gbp.rate.sx/btc?T' |
grep '^avg:' | cut -d ' ' -f 2

要从中删除英镑符号,只需将其通过管道cut -c 2-tr -d '£'放在最后即可。

请注意,如果只是输出结果,则没有理由首先将其放入变量中。

答案2

输出看起来像这样:

echo $price
26563 26396 1738 8 6 29

这是因为$price未加引号,这使得 shell 在空白处将其分割。echo获取多个参数,并用单个空格连接。

参见例如:什么时候需要双引号?

相关内容