使用grep时数据库连接范围

时间:2017-05-17 09:50:53

标签: bash sed grep db2 db2-luw

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

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数据库连接不存在。 SQLSTATE = 08003

我可以通过在select

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

db2 connect to sample

_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时是否可以扩展连接范围?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

您可以简单地将connectselect放入文件(甚至是here-document)中以将其作为脚本运行,从而保证两者都在同一会话中执行:

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

另见related question