如何在函数内正确替换变量

时间:2017-04-30 18:50:57

标签: bash shell unix

我很难在这个函数中使用正确的变量替换,尤其是使用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}"

所以,我被卡住了。

2 个答案:

答案 0 :(得分:2)

;{...}组表达式中缺少"$exp"(请参阅此documentation了解原因)。这是更正后的版本:

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

答案 1 :(得分: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中的所有信息与附加时间戳保持一致。