2017-02-22 24 views
0

У меня есть сценарий import.shИмпорт файла сценария и заполнить переменные внутри файла

. properties 
sql=$(cat sql.sql) 
${psql_path}/psql \ 
    -X \ 
    --set ON_ERROR_STOP=on \ 
    --set AUTOCOMMIT=on \ 
    --echo-all \ 
    ${sql} 
    ${dbname} > ${log_file} 2>> ${log_file} 

и файл properties

psql_path="/usr/pgsql-9.6/bin" 
dbname="postgres" 
path="/opt/files" 
log_file="ok.log" 

и файл sql.sql

-c "truncate table SCHEMA.TABLE1;" \ 
    -c "\\copy SCHEMA.TABLE1 FROM '${path}/TABLE1.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    -c "truncate table SCHEMA.TABLE2;" \ 
    -c "\\copy SCHEMA.TABLE1 FROM '${path}/TABLE2.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 

мне нужно запустить psql команду с импортированием строк из файла sql.sql на линии ${sql} в сценарии import.sh, но в том числе текст /opt/files вместо самой переменной ${path}, например:

${psql_path}/psql \ 
    -X \ 
    --set ON_ERROR_STOP=on \ 
    --set AUTOCOMMIT=on \ 
    --echo-all \ 
    -c "truncate table SCHEMA.TABLE1;" \ 
    -c "\\copy SCHEMA.TABLE1 FROM '/opt/files/TABLE1.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    -c "truncate table SCHEMA.TABLE2;" \ 
    -c "\\copy SCHEMA.TABLE2 FROM '/opt/files/TABLE2.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    ${dbname} > ${log_file} 2>> ${log_file} 

редактировать: все им получить прямо сейчас пример ниже. Как вставить текст переменной ${path}?

${psql_path}/psql \ 
    -X \ 
    --set ON_ERROR_STOP=on \ 
    --set AUTOCOMMIT=on \ 
    --echo-all \ 
    -c "truncate table SCHEMA.TABLE1;" \ 
    -c "\\copy SCHEMA.TABLE1 FROM '${path}/TABLE1.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    -c "truncate table SCHEMA.TABLE2;" \ 
    -c "\\copy SCHEMA.TABLE2 FROM '${path}/TABLE2.tsv' DELIMITER ';' CSV HEADER ENCODING 'UTF8' QUOTE '\"'" \ 
    ${dbname} > ${log_file} 2>> ${log_file} 
+1

Итак ... где код, в котором вы пытаетесь решить эту проблему, и в чем проблема с этим кодом? Измените свой вопрос, чтобы включить вашу попытку, любые ошибки, которые вы получаете, или подробное описание неожиданного поведения, которое вы видите. Если вы не можете создать полный [MCVE] (http://stackoverflow.com/help/mcve), то по крайней мере дать нам результаты, которые вам нужны для интерпретации. – ghoti

+0

ОК, я редактировал вопрос. Проще сказать, мне нужно включить файл 'sql.sql' в скрипт, но он укажет его с переменным текстом. – Martin

ответ

1

Эта линия:

sql=$(cat sql.sql) 

Поставит содержимое "sql.sql" в этом переменные $ SQL но не будет оценивать любые переменные внутри него. Правильный способ сделать это - использовать вместо этого heredoc. Но так как я выясняю вы хотите сохранить ваш сценарий, простое решение будет:

sql=$(cat sql.sql | sed -e '[email protected]${path}@'"${path}"'@') 

Это просто работает СЭД, чтобы заменить содержимое «$ {PATH}» в содержимое переменной оболочки из одно и то же имя. Но в любом случае подумайте об использовании heredocs, потому что ваш «sql» файл явно не является SQL вообще.

1

Как сообщил, то Heredoc лучший вариант, а затем простой подстановки параметров может быть сделано:

. properties 

sql=$(cat sql.sql) 

${psql_path}/psql <<-EOF 
    -X 
    --set ON_ERROR_STOP=on 
    --set AUTOCOMMIT=on 
    --echo-all 
    ${sql//\$\{path\}/$path} 
    ${dbname} > ${log_file} 2>> ${log_file} 
EOF 

Обратите внимание также, что расширения линии больше не требуются либо. Вы также должны удалить их из файла sql.sql