在 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。使用此选项,整个命令将具有最后遇到的非零退出状态的退出状态,来自手册页:

除非启用了 pipelinefail 选项,否则管道的返回状态是最后一个命令的退出状态。如果启用了 pipelinefail,则管道的返回状态是最后一个(最右边)以非零状态退出的命令的值,如果所有命令成功退出,则返回零。

例子:

#!/bin/bash

false | true
echo "Without pipefail: $?"

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

生产:

Without pipefail: 0
With pipefail: 1

相关内容