Вероятно, из-за того, что цитаты переосмысливаются при включении -c.Вам нужно что-то вроде:
su - postgres -c "/usr/bin/psql database -c \"SELECT 'DROP TABLE ' || ....
т.е. вам нужно снова заключить аргумент arg в psql -c.
Это быстро превращается в беспорядок.Вместо этого я предлагаю вам получить команду, которую вы хотите, чтобы psql выполнил, в качестве выходных данных, а затем просто заставить psql выполнить stdin (вообще не передавая -c).Это позволяет избежать кавычек и упрощает тестирование (просто выведите канал для psql, и вы увидите, что он получит).То есть:
echo "SELECT 'DROP TABLE ' || tablename ... " | su - postgres -c "psql database"
или используйте «здесь документ»:
su - postgres -c "psql database" <<EOF
SELECT 'DROP TABLE ' || tablename ...
EOF