将我的 "Sybase" 查询结果/输出存储到脚本变量中

Store my "Sybase" query result /output into a script variable

我需要一个变量来保存从脚本中的查询 (Sybase) 检索到的结果。

我构建了以下脚本,它工作正常我在 运行 时得到了想要的结果 脚本:EXECUTE_DAILY:

isql -U database_dba -P password <<EOF!
select the_name from table_name where m_num="NUMB912" and date="17/01/2019"
go
quit
EOF!
echo "All Done"

输出:

"EXECUTE_DAILY" 97 lines, 293 characters
user@zp01$ ./EXECUTE_DAILY
 the_name
 -----------------------------------
 NAME912

(1 row affected)

但现在我想将输出(the_name: NAME912)保存在一个变量中。

到目前为止,这基本上是我正在尝试但没有成功的方法。

variable=$(isql -U database_dba -P password -se "select the_name from table_name where m_num="NUMB912" and date="17/01/2019" ") 

但是,不起作用。我无法将 NAME912 保存在变量中。

您需要解析想要存储在变量中的所需 string/piece-of-data 的输出。我倾向于通过确保我可以 easily/quickly search/parse 得到我想要的东西来让我的生活更轻松。

记住几个问题...

  • 我倾向于使用 isql -s"|" -w10000 来确保(大部分时间)a) 结果集的所有列都用竖线 ('|') 分隔,b) 单个一行数据不跨越多行;竖线分隔符可以更轻松地解析出可能包含白色 space 的列;显然(?)如果管道可能是您实际数据的一部分,请使用不同的分隔符

  • 为了使 isql 输出的解析更容易一些,我倾向于向要查找的行添加一个唯一的 grep-able(文字)字符串 search/parse

  • 一些数据库(例如 SQLAnywhere、Oracle)倾向于模仿一个文字值作为列 header,如果所述文字字符串没有被显式分配 alias/header;这意味着如果您对文字字符串进行简单搜索,那么您将获得结果集 header 以及实际数据行

  • 的匹配项
  • 我倾向于将所有 isql 输出捕获到一个临时文件;这允许更容易 follow-on 处理,例如错误检查、数据解析、将内容转储到日志文件等

因此,考虑到上述情况,我的代码通常类似于:

$ outfile=/tmp/.$$.isql.outfile

$ isql -s"|" -w10000 -U database_dba -P password <<-EOF > ${outfile} 2>&1

-- 'GREP'||'ME' ensures that 'GREPME' only shows up in the data row

select 'GREP'||'ME',the_name
from   table_name
where  m_num = "NUMB912"
and    date  = "17/01/2019"
go
EOF

$ cat ${outfile}
... snip ...
|'GREP'||'ME'|the_name  |    # notice the default column header = 'GREP'||'ME' which won't match my search for 'GREPME'
|------------|----------|
|GREPME      |NAME912   |    # this is the line I want to search/parse
... snip ...

$ read -r namevar < <(egrep GREPME ${outfile} | awk -F"|" '{print }')
$ echo ${namevar}
NAME912