Синтаксическая ошибка awk в bash. Прекрасно работает в зш - PullRequest
0 голосов
/ 12 ноября 2018

Я написал следующий скрипт, который извлекает число из файла 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 голосов
/ 12 ноября 2018

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.

0 голосов
/ 12 ноября 2018

@ Ответ DiegoTorresMilano, вероятно, в целом лучше, но если вы хотите сделать это в bash, главное, что вам нужно сделать, это заключить в кавычки ссылки на переменные. Без двойных кавычек вокруг них bash (и большинство оболочек, кроме zsh) разбивает переменные на «слова», а также расширяет все, что выглядит как подстановочное выражение, в список совпадающих имен файлов. Вы почти никогда не хотите этого, поэтому используйте двойные кавычки. В вашем случае есть два места, в которых они нужны: около $line здесь:

index=$(awk -v var="$line" 'BEGIN {print index(var, "dailyratevalue") }')

и здесь:

echo "$line" | cut -c $index-$end | tail -c 4 | tr ',' '.' > selic

Обратите внимание, что вам не нужны двойные кавычки вокруг выражений $( ), потому что они находятся справа от оператора присваивания, и это не подлежит разделению слов и расширению по шаблону. Если бы они произошли где-то еще, вам, вероятно, тоже понадобятся двойные кавычки.

Кстати, shellcheck.net действительно хорошо показывает типичные ошибки, подобные этой, поэтому я рекомендую запускать через них ваши скрипты (даже если они кажутся работающими правильно).

0 голосов
/ 12 ноября 2018

index=$(awk -v var="$line" 'BEGIN {print index(var, "dailyratevalue") }')

должно это исправить.

...