内联输入内部条件的shell / ksh语法

问题描述 投票:0回答:3

完全忘记了如何正确执行操作,也可能忘记了正确的术语。

长内联输入(我认为这就是所谓的),使用Teradata bteq作为示例客户端读取stdin(与Oracle sql * plus或Sybase isql等相同-因此,几乎可以是任何东西。

bteq <<!

select sql_column1
`if [ "$mode" == "mode1" ]; then`
  , sql_column2
`fi`
  , sql_column3
from table1
;

!

这里,如果模式是“ mode1”-我输出3个sql_columns,否则输出2个。现在,想象一下这是一个非常大的输入,因此这些条件操作可能非常方便。我很确定我之前已经做过,但是covid-19完全刷新了我的记忆。使用这种语法,我会得到:第xx行的语法错误:'then'不匹配。

我该如何正确操作,以及我在这里所说的a)内联输入正确的Unix术语是什么?和b)内联条件?

linux shell unix ksh
3个回答
1
投票

如果您希望以多行SQL语句结尾,那么在这种特定情况下,您不需要“此处文档”,因为字符串可以跨越行。只要您的文本没有嵌入的引号,您就可以轻松地做到这一点。

if [ "$mode" == "mode1" ]; then
   col2="
, sql_column2"
else
   col2=""
fi

stm="select sql_column1$col2
, sql_column3
from table1
;"

echo "stm='$stm'"

如果不需要多行SQL语句,那么代码会更简单。


0
投票

看起来像Jeff的修订版或本修订版,如果您的“此处文档”和多个条件包含物太长,您都不希望打破逻辑:

bteq <<!

select sql_column1
`if [ "$mode" == "mode1" ]; then
 echo \"
  , sql_column2
 \"
fi`
  , sql_column3
from table1
;

!

0
投票

您可以在很多办法解决你的问题。混合了bteq,SQL,Bash和特殊测试后,别人怎么读您的代码?我认为下一种方法可能会有所帮助:我首先将bteq替换为cat进行测试。您可以将测试替换为

[[ "${mode}" == "mode1" ]] && echo ", sql_column2"

你在这里文档中使用这种(使用$(),而不是backtics)结果

cat << END
select sql_column1
$( [[ "${mode}" == "mode1" ]] && echo ", sql_column2")
, sql_column3
from table1
;
EOF

对于读者而言,这并不好。怎么办?发挥作用!

mode1_column() {
  [[ "${mode}" == "mode1" ]] && echo ", sql_column2"
}

cat << EOF
  select sql_column1
  $(mode1_column)
  , sql_column3
  from table1
  ;
EOF
© www.soinside.com 2019 - 2024. All rights reserved.