bash echo变量替换

时间:2014-10-14 23:03:56

标签: bash unix echo

我想用这个bash代码进行查询。

##fist I will extrac the table name from table.txt file
table=$(head -n 1 tables.txt)

#In this code is where I will make the substitution on the query
result=`echo "select 'result '||segment_name||':'||MB||':'||TOTAL_MB from (
   select TSEG.segment_name,round(TSEG.bytes/1024/1024) MB,l.segment_name as     LSEGMENT_NAME,nvl(l.MB,0) as LOB_MB,nvl(l.MB,0)+round(TSEG.bytes/1024/1024) as TOTAL_MB
  from dba_segments tseg,    (select LOBS.table_name,round(bseg.bytes/1024/1024)     MB,lobs.SEGMENT_NAME
       from dba_lobs lobs,dba_segments bseg
       where LOBS.SEGMENT_NAME=bseg.segment_name
       order by bseg.bytes asc
    ) l
   where TSEG.segment_type='TABLE'
   and TSEG.segment_name='$table'
   and TSEG.SEGMENT_NAME=l.table_name(+)
     order by TOTAL_MB
   )where rownum=1;`

我的问题是在线TSEG.segment_name =' $ table',我需要表格格式' TABLE_NAME'。

这是我的实际输出,表名为" AABLG":

select 'result '||segment_name||':'||MB||':'||TOTAL_MB from (
   select TSEG.segment_name,round(TSEG.bytes/1024/1024) MB,l.segment_name as     LSEGMENT_NAME,nvl(l.MB,0) as LOB_MB,nvl(l.MB,0)+round(TSEG.bytes/1024/1024) as TOTAL_MB
  from dba_segments tseg,    (select LOBS.table_name,round(bseg.bytes/1024/1024)     MB,lobs.SEGMENT_NAME
       from dba_lobs lobs,dba_segments bseg
       where LOBS.SEGMENT_NAME=bseg.segment_name
       order by bseg.bytes asc
     ) l
   where TSEG.segment_type='TABLE'
'  and TSEG.segment_name='AABLG
   and TSEG.SEGMENT_NAME=l.table_name(+)
     order by TOTAL_MB
   )where rownum=1;
你可以看到" ' "是第一个位置,我不知道为什么。

问候。 马可。

1 个答案:

答案 0 :(得分:2)

如果没有echo,这样做会好得多。例如,考虑一下:

IFS=$'\r\n ' read -r table <tables.txt
IFS= read -r -d '' result <<EOF
select 'result '||segment_name||':'||MB||':'||TOTAL_MB from (
   select TSEG.segment_name,round(TSEG.bytes/1024/1024) MB,l.segment_name as     LSEGMENT_NAME,nvl(l.MB,0) as LOB_MB,nvl(l.MB,0)+round(TSEG.bytes/1024/1024) as TOTAL_MB
  from dba_segments tseg,    (select LOBS.table_name,round(bseg.bytes/1024/1024)     MB,lobs.SEGMENT_NAME
       from dba_lobs lobs,dba_segments bseg
       where LOBS.SEGMENT_NAME=bseg.segment_name
       order by bseg.bytes asc
    ) l
   where TSEG.segment_type='TABLE'
   and TSEG.segment_name='$table'
   and TSEG.SEGMENT_NAME=l.table_name(+)
     order by TOTAL_MB
   ) where rownum=1;
EOF

这也解决了问题中观察到的错误,方法是将IFS设置为包含$'\r'的值,即在DOS格式的换行符中找到的回车符,从而在存在这些字符时将其删除在tables.txt第一行的末尾。