bashシェルスクリプトで実行したい非常に長いpsqlコマンドがあり、それを複数行に分割する正しい方法が何であるかを知りたいです。標準のUnixスクリプト「セパレータ」バックスラッシュ文字は効果がありません。もちろん、postgres環境では1行ずつ実行でき、閉じるセミコロンを入力するまでコマンドは処理されませんが、シェルスクリプトではそれを使用しません。
私のコマンドは次のとおりです。
sudo -u postgres /opt/puppet/bin/psql puppetdb -t -c "select certname, r.value as role, e.value as env from certname_facts r join certname_facts e using (certname) where r.name = 'role' and e.name = 'env' order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list
コマンドを変更したくありません。手動で入力するとすべてがうまく機能しますが、次のように分岐された項目に変換する正しい方法を知る必要があります。
sudo -u postgres /opt/puppet/bin/psql puppetdb -t
-c "select certname, r.value as role, e.value as env
from certname_facts r join certname_faces e using (certname)
where r.name = 'role' and e.name = 'env'
order by role,env,certname" | grep -v "^$" > /home/ansible/inventory_list
どんな提案がありますか?
ベストアンサー1
示されているように、バウンスに分割することに問題はありません。しかし、通常はstdinを介してSQLを送信する方が良いです。これはpostgresの場合に特にそうです。 "-c" オプションは 1 つのコマンドでのみ出力を返すように固定されていますが、stdin でコマンドを受け入れると、必要なだけ多くのコマンドを一緒に積み重ねることができるためです。したがって、次のことを行います。
sudo -u postgres /opt/puppet/bin/psql puppetdb -t <<SQL | ...
select certname, r.value as role, e.value as env
from certname_facts r join certname_faces e using (certname)
where r.name = 'role' and e.name = 'env'
order by role,env,certname
SQL
Bash変数をここに挿入できます。これを防ぐには、最初のケースを引用してくださいSQL
。
sudo -u postgres /opt/puppet/bin/psql puppetdb -t <<'SQL' | ...