2017-04-30 57 views
0

我很難得到正確的變量替換在這個函數內工作,特別是使用echo "$(...)字符串。如何正確替換函數內的變量

outputOFF() 
{ 
    host='mydevreporting.com' 
    _pw='123456foobar' 
    _dt=$(date +'%m-%d-%y') 
    exp="SELECT * FROM metrics.account_use where account='foo' and profile='bar' order by date desc;"; 
    echo "$(grep real < <({ time mysql -u admin -p${_pw} -h ${host} -N -e "$exp"} 2>&1)):localhost:${_dt}" 
    #echo "$(grep real < <(\{ time mysql -u admin -p${_pw} -h ${host} -N -e "$exp"\} 2>&1)):localhost:${_dt}" 
} 

在命令行中,它會工作:

echo "$(grep real < <({ time mysql -u admin -p123456foobar -h mydevreporting.com -N -e "SELECT * FROM metrics.account_use where account='foo' and profile='bar' order by date desc;"; } 2>&1)):localhost:$(date +'%m-%d-%y')" 

,因爲我看到錯誤消息:

./tst.sh: command substitution: line 40: syntax error near unexpected token `)' 
./tst.sh: command substitution: line 40: `{ time mysql -u admin -p${_pw} -h ${host} -N -e "$exp"} 2>&1)' 

正如你可以看到echo "$(...)這個函數裏面outputOFF()

我也試過逃避大括號\{, \},它允許變量替代,但某種程度上,該命令不能正常工作。 echo "$(grep real < <(\{ time mysql -u admin -p${_pw} -h ${host} -N -e "$exp"\} 2>&1)):localhost:${_dt}"

所以,我卡住了。

+1

'「$ exp」中的第一個引號結束字符串。因此,$ exp的內容暴露於shell評估。對你而言,幸運的是,一些分組阻止了這一點。但我不相信這個構造。一個'時間mysql ... | grep real'會更容易編寫和理解。 – ULick

+0

@ULick,命令替換可以包含引號(並且幾乎必須引用其中的變量),所以不用,「$ exp'周圍的引號不會結束引用。整個構造仍然看起來有點過於複雜。 – ilkkachu

+0

如果你有一個更好,更簡單和可讀的構造,我很樂意看到它。謝謝。 – noober

回答

2

您在"$exp"(請參閱此documentation爲什麼)之後在{...}組表達式中缺少;。這裏是更正後的版本:

echo "$(grep real < <({ time mysql -u admin -p${_pw} -h ${host} -N -e "$exp"; } 2>&1)):localhost:${_dt}" 
+0

此外,'echo「$(command)」'與'command'相同。 –

1

更少的大括號使它更具可讀性,至少對我而言。

result=$({ time mysql -u admin -p${_pw} -h ${host} -N -e "$exp"; } 2>&1 | grep real ); 
echo "${result}:localhost:${_dt}" 

time正在報告stderr。因此,{}需要捕捉輸出。

或放棄結果,只捕獲時間的結果。

result=$({ time mysql -u admin -p${_pw} -h ${host} -N -e "$exp" >/dev/null; } 2>&1) 
echo ${result}":localhost:${_dt}" 

未加引號的${result}打印時沒有換行符。因此,您可以使用附加時間戳保留來自time的所有信息。

+0

更容易閱讀。謝謝。 – noober