2017-02-22 75 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命令從文件導入行在腳本import.sh${sql}但包括文字/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}"'@') 

這是簡單的運行sed將「$ {路徑}」的內容代入的shell變量的內容同名。但無論如何,考慮使用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文件中刪除它們