Синтаксис shell / k sh для условия внутри встроенного ввода - PullRequest
0 голосов
/ 21 апреля 2020

Полностью забыл, как сделать это правильно, и, вероятно, также забыл правильные термины.

Длинный встроенный ввод (я думаю, это то, что он называется), используя Teradata bteq в качестве примера клиента, читающего stdin (так же, как Oracle sql* plus или Sybase i sql et c) - так что это может быть что угодно.

bteq <<!

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

!

Здесь, если режим "mode1" - I выведите 3 sql_columns, иначе два. Теперь представьте, что это очень большой ввод, поэтому эти условные манипуляции могут быть очень полезными. Я почти уверен, что делал это раньше, но covid-19 полностью очистил мою память. С этим синтаксисом я получаю: синтаксическая ошибка в строке xx: `then 'не соответствует.

Как мне сделать это правильно, и каковы правильные Unix термины для того, что я назвал здесь как) inline вход; и б) встроенное состояние?

Ответы [ 3 ]

1 голос
/ 21 апреля 2020

Если вы хотите закончить многострочным оператором SQL, тогда вам не нужен «здесь документ» в этом конкретном случае c, потому что строки могут занимать строки. Вы можете легко сделать это следующим образом, если в вашем тексте нет встроенных кавычек.

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

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

echo "stm='$stm'"

Если вам не нужен многострочный оператор SQL, тогда код проще.

0 голосов
/ 22 апреля 2020

Вы можете решить свою проблему множеством способов. Как кто-то может прочитать ваш код после смешивания 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
0 голосов
/ 22 апреля 2020

Похоже, либо ревизия Джеффа, либо эта, если ваш «документ здесь» и несколько условных включений слишком длинные, чтобы вы захотели нарушить логи c:

bteq <<!

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

!
...