Вы должны попробовать использовать переменные psql.Вот пример:
# Put the query in a file, with the variable TSTAMP:
> echo "SELECT :'TSTAMP'::timestamp with time zone;" > query.sql
> export TSTAMP='2019-03-01 00:00:00-06'
> RESULT=$(psql -U postgres -t --variable=TSTAMP="$TSTAMP" -f query.sql )
> echo $RESULT
2019-03-01 06:00:00+00
Обратите внимание, как мы форматируем строковый литерал в запросе:: 'TSTAMP'
Вы также можете выполнить подстановку самостоятельно.Вот пример использования heredoc:
> export TSTAMP='2019-03-01 00:00:01-06'
> RESULT=$(psql -U postgres -t << EOF
SELECT '$TSTAMP'::timestamp with time zone;
EOF
)
> echo $RESULT
2019-03-01 06:00:01+00
В этом случае мы не используем подстановку переменных psql, поэтому мы должны заключить переменную в кавычки, например, '$ TSTAMP'.Использование heredoc делает цитирование намного проще, чем использование -c, потому что вы не пытаетесь заключить в кавычки всю команду.
РЕДАКТИРОВАТЬ: больше примеров, потому что кажется, что этого недостаточно.TSTAMP не обязательно должен быть жестко запрограммирован, это просто переменная bash, которая может быть установлена, как любая другая переменная bash.
> TSTAMP=$(date -d 'now' +'%Y-%m-01 00:00:00')
> RESULT=$(psql -U postgres -t << EOF
SELECT '$TSTAMP'::timestamp with time zone;
EOF
)
> echo $RESULT
2019-06-01 00:00:00+00
Однако, если вы действительно ищете начало месяца, естьвообще не нужны переменные оболочки
> RESULT=$(psql -U postgres -t << EOF
SELECT date_trunc('month', now());
EOF
)
> echo $RESULT
2019-06-01 00:00:00+00