2016-12-26 41 views
-2

后,我有一个shell脚本,我有一种说法:变量未在bash得到分配的卷曲击中

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

现在,如果我只是附和RHS

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

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

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

+0

你想要[命令替换](https://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution):'isPartial = $(...)'。 –

回答

1

由于示例中反斜杠的数量有所不同,因此我不清楚双引号是否已在输入文本中转义。我假设他们都没有,即输入的文字看起来是这样的:

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

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

有一些要点。

  • 你似乎试图解析正则表达式的JSON输入。虽然这对于快速而肮脏的一次性作业是可以接受的,但在您知道正在处理的数据的确切格式的情况下,通常这是一个不好的主意。您应该使用JSON解析器,如jq

  • 你显然已经在变量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)。