如何使用 shell 脚本检查数据库中是否存在表

pre*_*rex 1 mysql shell

我正在尝试使用 shell 脚本检查表是否为空,我拥有的代码是

#!/bin/bash

if [ "mysql -u user -ppassword -hserver dbname -e 'select count(*) from test_dec;'" != 0 ];
then
        echo "table not empty"
else
        echo "table empty"
fi
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,它总是显示“表不为空”,即使查询的输出为 0。

user@server$ ./table_check.sh
table not empty
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?

cod*_*tex 6

这是我的脚本版本,它首先检查表是否存在,如果是,则检查表是否为空。

巴什

#!/bin/bash

# Prepare variables
TABLE=$1
SQL_EXISTS=$(printf 'SHOW TABLES LIKE "%s"' "$TABLE")
SQL_IS_EMPTY=$(printf 'SELECT 1 FROM %s LIMIT 1' "$TABLE")

# Credentials
USERNAME=YOUR_USERNAME    
PASSWORD=YOUR_PASSWORD
DATABASE=YOUR_DATABASE_NAME

echo "Checking if table <$TABLE> exists ..."

# Check if table exists
if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_EXISTS" $DATABASE) ]]
then
    echo "Table exists ..."

    # Check if table has records    
    if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_IS_EMPTY" $DATABASE) ]]
    then
        echo "Table has records ..."
    else
        echo "Table is empty ..."
    fi
else
    echo "Table not exists ..."
fi
Run Code Online (Sandbox Code Playgroud)

用法

首先,在使用此脚本之前,您需要将YOUR_USERNAMEYOUR_PASSWORDYOUR_DATABASE_NAME替换为相应的值。然后:

# bash SCRIPT_NAME TABLE_TO_CHECK
  bash my_script my_table
Run Code Online (Sandbox Code Playgroud)

其中SCRIPT_NAME ( my_script ) 是保存上述脚本内容的文件的名称,TABLE_TO_CHECK ( my_table ) 是您要检查的表的名称。

预期产出

Checking if table <my_table> exists ...  
Table exists ...   
Table is empty ... 
Run Code Online (Sandbox Code Playgroud)

关于守则的几句话

将命令行中的第一个参数存储在变量中 TABLE

TABLE=$1
Run Code Online (Sandbox Code Playgroud)

准备两个变量,用于保存用于检查的 SQL 查询。注意printf是用来在变量中插入表名的,因为$('SHOW TABLES LIKE "$TABLE"')是行不通的。

SQL_EXISTS=$(printf 'SHOW TABLES LIKE "%s"' "$TABLE")
SQL_IS_EMPTY=$(printf 'SELECT COUNT(*) as records FROM %s' "$TABLE")
Run Code Online (Sandbox Code Playgroud)

检查表是否存在。SHOW TABLES LIKE "table_name"如果表不存在,将返回空字符串并且if statement失败。使用$like$(echo 1 + 2)意味着 - 评估括号内的任何内容并将其作为值返回。

if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_EXISTS" $DATABASE) ]]
Run Code Online (Sandbox Code Playgroud)

最后我们检查表是否为空。使用以前的方法。基本上我们检查 MySQL 是否会返回空字符串(对于空表),否则查询将返回一些文本作为结果,我们可以认为表不为空。

if [[ $(mysql -u $USERNAME -p$PASSWORD -e "$SQL_IS_EMPTY" $DATABASE) ]]
Run Code Online (Sandbox Code Playgroud)