Для случаев, когда программы принимают входные данные, которые могут конфликтовать с процессом оболочки (например, кавычки, двойные кавычки и различные замены), обычно лучше использовать один из других параметров цитирования:
- Если программы могут обрабатывать STDIN, здесь могут использоваться документы (
<<word
). - Если программы работают только с параметрами командной строки, здесь документ может быть встроен
- Рассмотрите возможность использования переменных дляупростите цитирование.
Я полагаю, что psql также принимает ввод stdin, поэтому здесь документы могут работать (удаляя -c). Упрощение форматирования SQL для удобства чтения.
PGPASSWORD=XXX123 psql -h localhost -U postgres -d $db <<SQL
\copy (
SELECT *
FROM table_a h
JOIN table_b b ON h."IDX" = b."IDX"
WHERE b."XXX" BETWEEN 0 AND 500)
to '$path\onetry2.csv' with csv HEADER;
SQL
Если программы принимают только аргументы командной строки, можно использовать here strings
(обратите внимание, что это только функция bash, а не POSIX).
PGPASSWORD=XXX123 psql -h localhost -U postgres -d $db -c "$(cat <<SQL
\copy (
SELECT *
FROM table_a h
JOIN table_b b ON h."IDX" = b."IDX"
WHERE b."XXX" BETWEEN 0 AND 500)
to '$path\onetry2.csv' with csv HEADER;
SQL
)
Если команда составлена из переменных (или может храниться в переменных), она может исключить сложное цитирование.
V=$(cat <<SQL
\copy (
SELECT *
...
to '$path\onetry2.csv' with csv HEADER;
SQL
)
PGPASSWORD=XXX123 psql -h localhost -U postgres -d $db -c "$v"