Bash 如何在函数中正确替换变量

Bash 如何在函数中正确替换变量,bash,shell,unix,Bash,Shell,Unix,我很难在这个函数中使用正确的变量替换,尤其是使用echo“$(…)string 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

我很难在这个函数中使用正确的变量替换,尤其是使用
echo“$(…)
string

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“$(…)
位于该函数的内部
outputOFF()

我还尝试过转义大括号
\{,\}
,这允许替换变量,但不知何故,该命令无法正常工作。
echo“$(grep real<&1)):localhost:${{u dt}”


所以,我被卡住了

您缺少一个
{…}
组表达式中,
“$exp”
之后的code>(请参见此了解原因)。以下是更正的版本:

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

您缺少一个
{…}
组表达式中,
“$exp”
之后的code>(请参见此了解原因)。以下是更正的版本:

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

至少对我来说,更少的大括号使它更具可读性

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}
打印时不带换行符。因此,您可以使用附加的时间戳保留
时间中的所有信息。

更少的大括号使其更可读,至少对我来说是这样

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
中的所有信息。

“$exp”
中的第一个引号结束字符串。因此,$exp的内容将公开给shell评估。让你高兴的是,一些分组阻止了这一点。但我不相信这个构想。A
time mysql…|grep real
更易于编写和理解。@ULick,命令替换可以包含引号(而且几乎必须精确地引用其中的变量),因此,
“$exp
”周围的引号不会结束引用。整个结构看起来还是有点过于复杂。如果你有一个更好、更简单、可读性更好的结构,我很乐意看到它。谢谢。@ilkkachu不想探究,为什么它会起作用。试图把它解开一点。参见下面的答案。
“$exp”
中的第一个引号结束字符串。因此,$exp的内容将公开给shell评估。让你高兴的是,一些分组阻止了这一点。但我不相信这个构想。A
time mysql…|grep real
更易于编写和理解。@ULick,命令替换可以包含引号(而且几乎必须精确地引用其中的变量),因此,
“$exp
”周围的引号不会结束引用。整个结构看起来还是有点过于复杂。如果你有一个更好、更简单、可读性更好的结构,我很乐意看到它。谢谢。@ilkkachu不想探究,为什么它会起作用。试图把它解开一点。见下面的答案。