【问题标题】:Assign SQL result to shell variable将 SQL 结果分配给 shell 变量
【发布时间】:2019-11-13 23:20:10
【问题描述】:

我正在尝试将 db2 命令的结果分配给 shell 脚本中的变量:

backup_end_time="$(db2 select END_TIME FROM SYSIBMADM.DB_HISTORY where operation = "'B'" AND OBJECTTYPE = "'D'" ORDER BY START_TIME DESC FETCH FIRST 1 ROWS ONLY | awk 'NR==4')"

echo $backup_end_time

当我回显时,我得到一个空白值。我期待价值20191113030053

如果我在脚本之外尝试相同的命令而不分配给变量

db2 select END_TIME FROM SYSIBMADM.DB_HISTORY where operation = "'B'" AND OBJECTTYPE = "'D'" ORDER BY START_TIME DESC FETCH FIRST 1 ROWS ONLY | awk 'NR==4'

我得到了预期的输出。

如何将输出分配给变量?

【问题讨论】:

    标签: linux bash shell db2


    【解决方案1】:

    您需要正确引用引号,并使用 CLP 的 -x 选项以避免需要 awk 输出。

    例子:

    backup_end_time=$(db2 -x "select END_TIME FROM SYSIBMADM.DB_HISTORY where operation = 'B' AND OBJECTTYPE = 'D' ORDER BY START_TIME DESC FETCH FIRST 1 ROWS ONLY" )
    

    【讨论】:

      【解决方案2】:

      Bash 过于频繁地打开子 shell。
      当您调用v=$(db2 ...) 时,会打开一个新的子shell,并且db2 前端进程没有连接到为您当前的shell 打开的db2 后台进程(db2bp)。

      #db2 "select 1 from sysibm.sysdummy1" | awk 'NR==4' | read v
      
      tmpf=f.txt
      db2 "select 1 from sysibm.sysdummy1" | awk 'NR==4' > ${tmpf}
      read -r v < ${tmpf}
      rm -f ${tmpf}
      echo "Value: ${v}"
      

      注释掉的行适用于 ksh,但不适用于 bash。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-16
        • 2013-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多