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