curl命中后bash中未分配变量

curl命中后bash中未分配变量,bash,curl,sed,Bash,Curl,Sed,我有一个shell脚本,其中有一条语句: isPartial = $searchCurl| grep -Po '\"partialSearch\":(true|false)'|sed 's/\\\"partialSearch\\\"://' 现在,如果我只是回应RHS $searchCurl| grep -Po '\"partialSearch\":(true|false)'|sed 's/\\\"partialSearch\\\"://' 它会打印“partialSearch”:true

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

isPartial = $searchCurl| grep -Po '\"partialSearch\":(true|false)'|sed 's/\\\"partialSearch\\\"://'
现在,如果我只是回应RHS

 $searchCurl| grep -Po '\"partialSearch\":(true|false)'|sed 's/\\\"partialSearch\\\"://'
它会打印
“partialSearch”:true
,但变量
isPartial
不会初始化


为什么会发生这种情况?我如何修复它?

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

sometext... "partialSearch":true ... sometext... 
..bla bla bla... "partialsearch":false ...
我下面的例子将在这个假设下工作

有几点需要说明

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

  • 显然,您在变量
    searchCurl
    中存储了一些bash代码。这被认为是不好的做法。您应该执行
    函数searchCurl(){…code…}
    而不是
    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
将包含一个以空格分隔的列表,其中包含
true
false
)。

您想要的是:
isPartial=$(…)