bash中的awk语法错误。在zsh中工作正常

时间:2018-11-12 01:13:54

标签: bash shell awk zsh

我编写了以下脚本,用于从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只是可以让我知道我想要的模式的位置。

这可能是什么?

3 个答案:

答案 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确实善于指出这样的常见错误,因此我建议通过它运行脚本(即使它们似乎正常工作)。