Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash中的awk语法错误。在zsh中运行良好_Bash_Shell_Awk_Zsh - Fatal编程技术网

bash中的awk语法错误。在zsh中运行良好

bash中的awk语法错误。在zsh中运行良好,bash,shell,awk,zsh,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 $lin

我编写了以下脚本,从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
awk:cmd。行:1:
index=$(awk-v var=“$line”'开始{print index(var,“dailyratevalue”)})

应该修复它。

index=$(awk-v var=“$line””开始{print index(var,“dailyratevalue”)}


应该可以修复它。

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并获取与
dailratevalue

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

@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
请注意,
$()
表达式周围不需要双引号,因为它们位于赋值语句的右侧,不需要进行分词和通配符扩展。如果它们发生在其他地方,您可能也希望在它们周围加上双引号


顺便说一句,我非常擅长指出这样的常见错误,因此我建议您运行脚本(即使它们似乎工作正常)。

@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
请注意,
$()
表达式周围不需要双引号,因为它们位于赋值语句的右侧,不需要进行分词和通配符扩展。如果它们发生在其他地方,您可能也希望在它们周围加上双引号


顺便说一句,我非常擅长指出像这样的常见错误,所以我建议您运行脚本(即使它们似乎工作正常)。

这很有效!但是我的输出不是期望的。不知何故,角色在bash上的位置不同,我最终得到的是垃圾,而不是我需要的数字。你的是什么?也是249。输出到文件的字符是不同的。在我需要的号码之前我马上得到了3个字符。这很有效!但是我的输出不是期望的。不知何故,角色在bash上的位置不同,我最终得到的是垃圾,而不是我需要的数字。你的是什么?也是249。输出到文件的字符是不同的。我在需要的号码前立即得到3个字符。使用
grep
查找要传递给Awk的行号是完全无用的。Awk本身可以很好地匹配正则表达式,并且行号本身似乎不会在这里添加任何内在值。@RCS:参数传递在zsh和bash中的工作方式不同。在您的例子中,您可以双引号
“$line”
,但一般来说,构建一个同样适用于zsh和bash的程序没有多大意义-有太多的差异。还请注意,如果要在bash或zsh中运行脚本,则将
/bin/sh
放在
#中是危险的行。使用
grep
查找要传递给Awk的行号是完全无用的。Awk本身可以很好地匹配正则表达式,并且行号本身似乎不会在这里添加任何内在值。@RCS:参数传递在zsh和bash中的工作方式不同。在您的例子中,您可以双引号
“$line”
,但一般来说,构建一个同样适用于zsh和bash的程序没有多大意义-有太多的差异。还请注意,如果要在bash或zsh中运行脚本,则将
/bin/sh
放在
#中是危险的行。