【问题标题】:Shell script for connecting to DB2 database is not working用于连接 DB2 数据库的 Shell 脚本不起作用
【发布时间】:2019-05-11 05:17:25
【问题描述】:

我编写了一个用于连接 DB2 数据库的 shell 脚本。此脚本列出 DB2 服务器上的数据库,并在用户输入所需的数据库名称后连接到数据库。但是在脚本以成功的数据库连接信息运行后,当我尝试对数据库运行命令时,它说数据库连接不存在。 SQLSTATE=08003

#!/bin/bash
#
#DBA DB2 Script: DB connection script-connectdb
#Created By : Ashish Verma
#Creation Date : 04/27/2019
#
#Purpose: This script connects to and activates the database

#printf "Below is the list of databases"
DBLIST=`db2 list db directory | grep -i alias | awk '{print $4}'`#This stores all the available databases in DBLIST
USER=`whoami`
echo "Following are the list of available database(s)"
echo "----------------------------------------------"
for db in $DBLIST; do
        echo $db#Present the user will all available databases to choose and input
done
printf "\nEnter the name of the database you wish to connect to:  "
read CHOICE#User enters tha db name 
DB=`db2 "connect to $CHOICE user $USER"`##connection to database is made and output stored in variable DB
if [ -z "$(echo $DB | awk '{print $18}')" ]; then
        printf "Database connection failed! Please check the below error: "#Prints if database is not connected to
        printf "\n$DB\n"
else
        printf "\nYou are connected to database $DB\n"#Prints successful connection
fi

#End of Script

运行上述脚本后,数据库连接成功,并打印“您已连接到数据库 $DB”行。任何从 shell 对数据库运行的命令都应该成功。 例如:db2 列出表空间; 但即使在上述脚本中成功建立数据库连接后,当我尝试对数据库运行命令时,它表示数据库连接不存在,我必须从“db2 connect to database db_name”命令中触发shell 来操作数据库。有人可以帮我,为什么即使在成功运行上述脚本后我还需要触发连接数据库命令?

【问题讨论】:

  • 您能否再解释一下 - 特别是为什么您认为连接应该持续存在? shell脚本中的错误发生在哪里? FWIW,行 DBLIST=db2 ... 将执行 db2 命令。 db2 将做任何事情(例如生成列表)并终止。为什么?因为如果它没有终止,设置 DBLIST 的管道将永远不会结束。只要 db2 命令运行,它就会保持打开的标准输出,其余的都无法完成。现在,如果 db2 终止,它必须为 DBLIST(或 DB= 等)终止,那么连接不太可能保持打开状态。
  • 您看到的行为是“按设计工作”,因为一旦您的脚本退出,来自 bash 的连接就会自动关闭。
  • @mao 你能建议在这种情况下可以做什么吗?如何创建一个在退出时不关闭来自 bash 的连接的脚本?

标签: bash shell scripting db2


【解决方案1】:

我建议直接在代码中将连接建立为命令,而不是作为创建子外壳的变量分配的一部分。

db2 connect to $CHOICE user $USER

之后,只检查错误代码而不是生成的输出。

if [ $? -ne 0 ] ; then
  echo error
  exit 1
fi

如果确实需要处理输出,则将 db2 输出重定向到文件(甚至是临时文件)并通过读取文件(cat)来处理输出。

永远不要通过子shell将输出传递给变量,例如

`db2 ...`

$(db2 ...)

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 2011-04-16
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多