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' | ...
答え2
申し訳ありません。私は標準のバックスラッシュ文字を使ってみましたが、うまくいきました。
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
同僚のDBAは、これが「標準」UnixコマンドではなくSQLコマンドであるため、機能しないと述べました。信じる前に自分で試してみる必要があるようです!
答え3
基本クエリだけを入力したい場合は、次のようにします。
SELECT *
FROM table_name ...
その後、WHEREやORDER BYなどの追加エントリがあります。知りたいのは、クエリの連続した1行だけを入力しないように、別の行にきれいに折りたたむ方法です。
次の行に移動するには、Enterキーを押します。 Psqlは、.psqlファイルを入力するまでクエリを受け入れません;
。
次の例のように、大文字と小文字は区別されますが、スペースは区別されないことに注意してください。
mycomputer=# SELECT *
mycomputer-# FROM sacramento
mycomputer-# WHERE beds <= 1
mycomputer-# LIMIT 20;
また、意味のない内容を入力すると、psqlが何も知らせないことを知ることも重要です!ただ次の行に進みます。
また、再利用する長いクエリを作成する場合は、クエリを含むファイルを編集して.psqlを使用して呼び出す方が効率的であることに注意してください\i file_name
。
次のブログ投稿は始めたときに多くの助けになりました。