2016-12-26 40 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)。