2017-04-30 26 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')" 

私はエラーメッセージを見ているとして:あなたはecho "$(...)この機能outputOFF()内にある見ることができるように

./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 "$(grep real < <(\{ time mysql -u admin -p${_pw} -h ${host} -N -e "$exp"\} 2>&1)):localhost:${_dt}"

私は立ち往生しています。

+1

'' $ exp "'の最初の引用符は、文字列を終了します。したがって、$ expの内容はシェルの評価にさらされます。あなたのために幸せに、いくつかのグループ化はそれを防ぎます。しかし、私はその構造を信じていません。 'time 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

関連する問題