if文でmysqlコマンドの出力および終了コードを使用する

if文でmysqlコマンドの出力および終了コードを使用する

このスクリプトの冒頭では、ユーザーとユーザーの資格情報を変数として読み込みます。

次のコードは期待どおりに機能し、mysqlユーザーの資格情報を確認します。

lu="test"
lp="test-password"
ldb="local_db"

if mysql -u $lu -p"$lp" $ldb -e "quit"; then
  printf "true"
  return 0;
else
  printf "false"
  return 1;
fi

このコードが実行されると、コマンドラインでパスワードの使用に関するmysql警告が表示されます。 mysqlコマンドの終了コードを評価しながら、出力で警告を抑制したいと思います。

これに回答エラーメッセージ抑制の使用方法に関して、出力はmysqlcommand 2>&1 | grep -v "Warning: Using a password"警告のみを削除します。他のすべての出力は引き続き表示されます。

私はそれを私のコードに統合しようとしましたが、成功しませんでした。私ができる方法はありますか?

答え1

はい。問題は、パイプの終了状態がパイプの最後の要素の終了状態であることです。

bashの最新バージョンでは、PIPESTATUS配列を使用して書き込むことができます。

mysqlcommand 2>&1 | grep -v ...
if [ ${PIPESTATUS[0]} -eq 0 ] ; then
    printf "true\n"
    return 0
 else
 ...

より多くのポータブルソリューションが存在します。あなたは実行することができます

( mysqlcommand ; echo $? > lastsqlret ;) 2>&1 | grep ...
if grep '^0$' lastsqlret ; then
...

一時ファイルを使用すると、ファイル記述子操作を使用して一時ファイルを回避できます。

答え2

パイプの終了状態は、常に最後のコマンドの終了状態です。 Bashでは、設定でこの動作を変更できますset -o pipefail。このオプションを使用すると、コマンド全体は、マニュアルページで最後に発生したゼロ以外の終了状態の終了状態を持ちます。

パイプライン障害オプションが有効になっていない場合、パイプラインの戻り状態は最後のコマンドの終了状態です。パイプライン障害がアクティブな場合、パイプラインの戻り状態は、ゼロ以外の状態で終了した最後の(最も右側の)コマンドの値、またはすべてのコマンドが正常に終了した場合は0です。

例:

#!/bin/bash

false | true
echo "Without pipefail: $?"

set -o pipefail
false | true
echo "With pipefail: $?"

生産:

Without pipefail: 0
With pipefail: 1

関連情報