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

时间:2019-07-15 15:32:18

标签: sql bash scripting sybase

我需要一个变量来保留从脚本中的查询(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 保存在变量中。

1 个答案:

答案 0 :(得分:1)

您需要解析输出,以获取希望存储在变量中的所需字符串/数据片段。通过确保可以轻松/快速地搜索/解析我想要的东西,我倾向于使我的生活更轻松。

记住一些问题...

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

  • 使isql输出的解析更容易一些,我倾向于在我要搜索/解析的行中添加一个唯一的,可重复表示的(文字)字符串

  • 某些数据库(例如SQLAnywhere,Oracle)如果尚未为文字字符串指定显式别名/标题,则倾向于将文字值模拟为列标题。这意味着,如果您对文字字符串进行简单搜索,那么您将获得结果集标题和实际数据行的匹配项

  • 我倾向于将所有isql的输出捕获到一个临时文件中;这样可以简化后续处理,例如错误检查,数据解析,将内容转储到日志文件等

因此,考虑到以上几点,我的代码通常看起来像:

$ 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 $3}')
$ echo ${namevar}
NAME912