2016-10-29 76 views
1

如果我想設置的值等參數:串接在命令替換

key="some" 
value=$(cat ${filename} | grep ${key}"string" | cut -d 'string' -f2) 

我該怎麼辦,以獲得${key}"string"工作?它不處理${key}變量以將其與字符串連接起來。我想做的事:

cat $filename | grep "somestring" | cut... 
+0

'key = some;回聲'somestring'| grep -o「$ {key} s」'outputs'somes' –

+0

你在做什麼工作。 – mkj

+0

是的,謝謝,一定是錯誤的切片 – DavidA

回答

3

正確連接具有字面"string"變量引用${key}嵌入的雙引號字符串裏面的變量引用:

key="some" 
... | grep "${key}string" | ... 

注意如何封閉的可變現在{...}的名字實際上是現在需要來告訴shell變量名在哪裏結束。 chepner指出在別處評論:
${key}是執行參數擴張規範方式時,他們沒有必要附上一個擴展運營商或消除歧義參數名的括號可以選擇性地被丟棄。」

隨着具體採樣值"some",您的級聯(${key}"string")會,工作是相同的,但不是一般,因爲使用${key}不帶引號的使得它受到shell expansions特別是分詞,如果變量${key}恰好包含空格,將會中斷grep命令。


與您的代碼的主要問題,然而,就是你傳遞一個多字符串cut -d以指定一個分隔符,而只有一個單個字符支持。

如果你有GNUgrep,你可以嘗試以下方法:

key="some" 
value=$(grep -Po "${key}string"'\K.*$' "${filename}") 

這之後"${key}string"從匹配行,這就是我相信你的意圖是恢復一切
假設是"${key}string"最多匹配一次每行。

小告誡是,你現在可以有逃避的${key}值的正則表達式元字符,如.,也是文字部分("string"),使其作爲一個正則表達式工作。

在相同的假設和警告,你可以試試這個POSIX兼容的awk解決方案:

key="some" 
value=$(awk -F "${key}string" 'NF >= 2 { print $2 }') 

這就是說,如果有可能多個比賽,你所需要的琴絃比賽之間在每一行上,都有可能適應這種解決方案。