【问题标题】:Variable not getting assigned in bash after a curl hitcurl命中后未在bash中分配变量
【发布时间】:2016-12-26 13:08:59
【问题描述】:

我有一个 shell 脚本,其中有一个语句:

isPartial = $searchCurl| grep -Po '\"partialSearch\":(true|false)'|sed 's/\\\"partialSearch\\\"://'

现在,如果我只是回应 RHS

 $searchCurl| grep -Po '\"partialSearch\":(true|false)'|sed 's/\\\"partialSearch\\\"://'

它打印"partialSearch":true,但变量isPartial 没有被初始化。

为什么会发生这种情况,我该如何解决?

【问题讨论】:

标签: bash curl sed


【解决方案1】:

由于您的示例中反斜杠的数量各不相同,我不清楚输入文本中是否已经对双引号进行了转义。我假设它们不是,即输入文本看起来像:

sometext... "partialSearch":true ... sometext... 
..bla bla bla... "partialsearch":false ...

我下面的例子将在这个假设下工作。

有几点需要说明。

  • 您似乎正在尝试使用正则表达式解析 JSON 输入。虽然这对于您知道正在处理的数据的确切格式的快速而肮脏的一次性工作是可以接受的,但总的来说,这是一个非常坏主意。您应该使用像 jq 这样的 JSON 解析器。

  • 您显然在变量searchCurl 中存储了一些bash 代码。这被认为是不好的做法。而不是searchCurl="... code ...",您应该使用function searchCurl () { ... code ... } 并调用searchCurl,而不用在其前面加上美元符号。变量用于值,函数用于代码。

  • 在大多数情况下,如果您要使用sed,最好在不调用grep 的情况下使用它。有时两者兼而有之会更简单。请参阅下面的示例。

  • 要将命令的输出分配给变量,您必须使用命令替换。

简而言之,如果在您的输入文本中只有一个匹配 '"partialSearch":(true|false)',这就是您想要的:

isPartial=$(searchCurl|sed -rn 's/^.*"partialSearch":(true|false).*$/\1/p')

如果您有更多并且输入文本是我认为的一大行,则使用 grep -o 可能会简化将输入拆分为每行一个匹配项的任务,以便

isPartial=$(searchCurl|grep -Po '"partialSearch":(true|false)'|sed -e 's/^.*://')

可能是您想要的(在这种情况下,isPartial 将包含truefalse 的空格分隔列表)。

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2014-10-06
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多