我很難得到正確的變量替換在這個函數內工作,特別是使用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}"
所以,我卡住了。
'「$ exp」中的第一個引號結束字符串。因此,$ exp的內容暴露於shell評估。對你而言,幸運的是,一些分組阻止了這一點。但我不相信這個構造。一個'時間mysql ... | grep real'會更容易編寫和理解。 – ULick
@ULick,命令替換可以包含引號(並且幾乎必須引用其中的變量),所以不用,「$ exp'周圍的引號不會結束引用。整個構造仍然看起來有點過於複雜。 – ilkkachu
如果你有一個更好,更簡單和可讀的構造,我很樂意看到它。謝謝。 – noober