2016-10-21 6 views
1

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

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

Shell Script и переменная внутри check_data.ksh

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

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

sel * from test_table 
where cond = Rundate 

В приведенном выше коде, я хочу 'Rundate' приходить из check_data .ksh

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

EDITED

Что я хочу: Я хочу иметь переменную RUNDATE (содержащий значение DATE) и хотите использовать эту переменную в любом месте. Значение 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>&1 

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

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

ответ

1

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

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

Это позволяет избежать надоедливых внешнего файла, а также по совпадению удаляет Fugly useless use of cat

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

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

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

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

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

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

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

0

Вы можете просто обновить сценарий, чтобы изменить ключевое слово 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>&1 

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

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

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

+0

Вам нужно расширить команду 'sed', например,' s/var1/$ var1/g'. Добавьте столько, сколько хотите, разделенных полуповтором ';'. «Var1» - это ключевое слово в вашем запросе, '$ var1' - это переменная bash, содержащая значение. – oliv

+0

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