【问题标题】:shell/ksh syntax for a condition inside inline input内联输入中条件的 shell/ksh 语法
【发布时间】:2020-04-21 03:30:05
【问题描述】:

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

长内联输入(我认为这就是它的名称),使用 Teradata bteq 作为示例客户端读取标准输入(与 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' unmatched。

我该如何正确地做到这一点,以及我在这里所说的正确的 Unix 术语是什么 a) 内联输入; b) 内联条件?

【问题讨论】:

  • 术语是“这里的文档”。

标签: linux shell unix ksh


【解决方案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语句,那么代码就更简单了。

【讨论】:

    【解决方案2】:

    您可以通过多种方式解决您的问题。混合 bteq、SQL、Bash 和特殊测试后,别人如何阅读您的代码?我认为下一种方法可能会有所帮助:
    我开始用cat 替换bteq 进行测试。
    你可以用

    替换你的测试
    [[ "${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
    

    【讨论】:

      【解决方案3】:

      看起来像 Jeff 的修订版,或者这个修订版,如果“这里文档”和多个条件包含太长而不想破坏逻辑:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-23
        • 2014-01-25
        • 2015-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多