我编写了以下脚本,用于从rss文件中提取数字。
#!/bin/sh
wget -O selic https://conteudo.bcb.gov.br/api/feed/pt-br/PAINEL_INDICADORES/juros
line=$(grep 'dailyratevalue' selic)
index=$(awk -v var=$line 'BEGIN {print index(var, "dailyratevalue") }')
end=$((index+21))
echo $line | cut -c $index-$end | tail -c 4 | tr ',' '.' > selic
在zsh中它可以完美工作,但是我也需要它在bash中工作。我尝试在bash上运行它,但出现以下错误
awk: cmd. line:1: <content
awk: cmd. line:1: ^ syntax error
错误模式<content
来自作为awk参数的行,对我来说这没有意义,因为awk只是可以让我知道我想要的模式的位置。>
这可能是什么?
答案 0 :(得分:2)
index=$(awk -v var="$line" 'BEGIN {print index(var, "dailyratevalue") }')
应该修复它。
答案 1 :(得分:2)
awk
可以执行所有其他步骤。你可以
wget -qO - https://conteudo.bcb.gov.br/api/feed/pt-br/PAINEL_INDICADORES/juros | \
awk -F '&[gl]t;' '/dailyratevalue/ {sub(",", ".", $25); print $25;}'
并获取所需的值。
这是设置FS,并为与dailyratevalue
匹配的行获取所需的字段。
答案 2 :(得分:1)
@DiegoTorresMilano的答案总体上可能更好,但是如果您要使用bash进行操作,则主要要做的是将变量引用双引号。 bash(以及zsh以外的大多数shell)周围没有双引号,它将变量分解为“单词”,并且还将任何类似于通配符表达式的内容扩展为匹配的文件名列表。您几乎永远不需要它,因此请使用双引号。在您的情况下,有两个地方需要使用:在$line
附近:
index=$(awk -v var="$line" 'BEGIN {print index(var, "dailyratevalue") }')
在这里:
echo "$line" | cut -c $index-$end | tail -c 4 | tr ',' '.' > selic
请注意,$( )
表达式周围不需要双引号,因为它们位于赋值语句的右侧,并且不受单词拆分和通配符扩展的影响。如果它们发生在其他地方,您可能也希望在它们周围加上双引号。
顺便说一句,shellcheck.net确实善于指出这样的常见错误,因此我建议通过它运行脚本(即使它们似乎正常工作)。