Передача переменных из сценария оболочки в файл BTEQ

#linux #shell #sh #teradata #ksh

#linux #оболочка #sh #teradata #ksh

Вопрос:

У меня есть сценарий оболочки (.ksh), внутри которого я вызываю файл BTEQ для выполнения SQL-запроса. Однако дата выполнения файла BTEQ зависит от доступности данных, которые проверяет другой SQL-запрос внутри сценария оболочки.

Что я хочу: я хочу передать переменную ‘Date’ из сценария оболочки в файл BTEQ, чтобы выполняемый запрос учитывал эту ‘date’.

Сценарий оболочки и переменная внутри check_data.ksh

 Rundate=`date  "%Y-%m-%d"`
cat ~/.tdlogon_simba sample_TD.btq | bteq >> ${log_file} 2>amp;1
  

Код файла Bteq (Sample_TD.btq)

 sel * from test_table
where cond = Rundate
  

В приведенном выше коде я хочу, чтобы ‘Rundate’ исходил из check_data.ksh

Чего я не хочу: На самом деле мой запрос очень большой, около 3000 строк кода, поэтому я не хочу выполнять запрос внутри сценария оболочки.

ОТРЕДАКТИРОВАНО

Что я хочу: я хочу иметь переменную RUNDATE (содержащую значение ДАТЫ) и хочу использовать эту переменную везде. Значение RUNDATE должно быть присвоено при запуске сценария оболочки, в основном, оно должно быть прочитано только один раз и должно оставаться неизменным на протяжении всего пакетного процесса, т. е. оно не должно меняться, даже если наступил новый день, если процесс запущен.

Я могу прочитать 1 день в сценарии оболочки, используя

 RUNDATE=`date  "%Y-%m-%d" -d " 1 day"`
  

Теперь я запускаю два пакетных процесса run_data_check и run_batch внутри сценария оболочки, в котором я буду передавать эту дату в файл BTQ. Data_check — это итеративный процесс, и я не знаю, когда поступают данные. Таким образом, я хочу, чтобы дата была исправлена, чтобы проверить наличие этих данных за этот день.

Если я использую

 run_tdcheck
sed "s/RUNDATE/$(date  '%Y-%m-%d' -d ' 1 day')/g" ~/.tdlogon_simba test.btq | bteq >> ${log_file} 2>amp;1
  

Тогда это не помогает моему делу, поскольку каждый раз, когда эта функция запускается, она учитывает системную дату и соответствующим образом изменяется. Я хочу, чтобы эта дата выполнения была исправлена до завершения пакетной обработки.

Любой способ, которым я могу решить эту проблему.

Ответ №1:

Похоже, вы действительно ищете документ here.

 bteq <<____HERE >>"$log_file" 2>amp;1
    sel * from test_table
    where cond = $(date  "%F");
____HERE
  

Это позволяет избежать надоедливого внешнего файла, а также по совпадению устраняет ненадежное бесполезное использование cat

Если вы хотите, чтобы дата оставалась неизменной после того, как вы ее рассчитали (чтобы она не менялась внизу, если скрипт запускается после полуночи),

 rundate=$(date  %F -d ' 1 day')
bteq <<____HERE >>"$log_file" 2>amp;1
    sel * from test_table
    where cond = $rundate;
____HERE
  

Любая переменная или подстановочный знак в документе here будут оценены оболочкой перед bteq запуском (при условии, что вы не заключаете разделитель here-document в кавычки); вот почему звездочка должна быть экранирована обратной косой чертой (в противном случае оболочка расширит глобус до списка всех файлов в текущем каталоге).

Кстати, вам следует избегать прописных букв для ваших собственных переменных, поскольку прописные буквы зарезервированы для использования системой.

Конечно, то же самое можно было бы сделать с sed — просто убедитесь, что вы не используете одинарные кавычки, поскольку они не позволяют оболочке видеть и изменять переменную.

 sed "s/RUNDATE/$rundate/g" ~/.tdlogon_simba test.btq |
bteq >> ${log_file} 2>amp;1
  

Комментарии:

1. Спасибо, @tripleee. Я отредактировал свой вопрос, чтобы более четко изложить свой вариант использования. Можете ли вы посоветовать мне сейчас, как мне следует поступить.

Ответ №2:

Вы можете просто обновить свой скрипт, чтобы изменить ключевое слово Rundate в вашем .btq файле, используя sed :

 rundate="$(date -d ' 1 day'  %Y-%m-%d)"
sed "s/Rundate/$rundate/g" ~/.tdlogon_simba sample_TD.btq | bteq >> ${log_file} 2>amp;1
  

sed Команда изменит все вхождения ключевого слова Rundate . Возможно, вы захотите уточнить это, установив более строгий поиск, например:

 sed "s/cond = Rundate/cond = $rundate/g"
  

Комментарии:

1. Спасибо, @oliv. Кажется, с этим все работает нормально. Просто интересно, как это будет работать, когда мне нужно отправить несколько аргументов вместе в файле Bteq, например Rundate, Var1, Var2, как параметры / значения. Можете ли вы помочь мне с этим.

2. Вам нужно расширить sed команду, например s/var1/$var1/g . Добавьте столько, сколько хотите, разделенных точкой с запятой ; . var1 Это ключевое слово в вашем запросе, $var1 это переменная bash, содержащая значение.

3. Я понял, что решение, которое вы дали, на самом деле не удовлетворяло условию. Возможно, я не предоставил правильный вариант использования. Я отредактировал свой вопрос. Можете ли вы помочь мне решить эту проблему? Спасибо!