使用 grep 时的数据库连接范围

Database connect scope when using grep

正在尝试从数据库中获取 2 个字符的版本 table sysibm.sysversions。这是独立工作的:

db2 -x "select versionnumber from sysibm.sysversions where UPPER(authid) = UPPER('db2dev')" | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' | head -c2

这给出了结果:

11

尝试将其合并到脚本中会产生奇怪的结果

db2 connect to sample

_dbversion=$(db2 -x "select versionnumber from sysibm.sysversions where UPPER(authid) = UPPER('${_dbuser}')"  | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//')
echo -e "${_dbversion}"

这会导致连接错误

SQL1024N A database connection does not exist. SQLSTATE=08003

我可以通过在 select

之外执行 grep 来解决这个问题

db2 连接到样本

_dbversion=$(db2 -x "select versionnumber from sysibm.sysversions where UPPER(authid) = UPPER('${_dbuser}')")
_dbversion_head=$(echo -e ${_dbversion1} | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' | head -c2)
echo -e "${_dbversion_head}"

或括号内连接

_dbversion=$(db2 -x connect to sample; db2 -x "select versionnumber from sysibm.sysversions where UPPER(authid) = UPPER('${_dbuser}')" | sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//' | head -c2)

使用 grep/sed 时是否可以扩展连接范围?

获取版本号还有两种方法:

我建议使用它,因为它们占用的资源更少。

管道导致 db2 -x "select..." 在子 shell 中执行,而连接保持在父 shell 的本地。

您可以简单地将 connectselect 放入一个文件(甚至是此处的文档)中 运行 它们作为脚本,从而保证两者在同一个文件中执行会话:

db2 -x <<EOF | sed -e ...
connect to yourdb
select versionnumber ...
EOF

另见