質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

2回答

8581閲覧

シェル内のpsqlコマンドを展開したい

jusco870103

総合スコア11

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/10/31 14:28

お手数おかけいたしますが、以下事象についてご見識をいただければと存じます。
宜しくお願い致します。

#前提・実現したいこと
・リモートのPostgreSQLサーバにpsqlコマンドで"pg_create_restore_point"を実行したい。
・上記のコマンドを変数に代入し、展開すれば実行できるようにしたい

#発生している問題・エラーメッセージ
変数を展開しようとしたところ、psql -c 以降のコマンドがselectとpg_create_restore_pointの間で分離してしまい、エラーにより実行されない

bash -x ${CMD_RESTORE}

~~中略~~

  • ./psql.bin -h 192.168.0.1 -U postgres -d test_db -p 5444 -c '"select' 'pg_create_restore_point(201810310000)"'

psql.bin: 警告: 余分なコマンドライン引数 "pg_create_restore_point(201810310000)"" は無視されました。
ERROR: unterminated quoted identifier at or near ""select"
行 1: "select

#該当のソースコード

bash

1DB_HOST="192.168.0.1" 2DB_USER="postgres" 3DB_NAME="test_db" 4DB_PORT=5444 5RESTORE_NAME=201810310000 6 7CMD_RESTORE="psql -h ${DB_HOST} -U ${DB_USER} -d ${DB_NAME} -p ${DB_PORT} -c \"select pg_create_restore_point(${RESTORE_NAME})\"" 8 9${CMD_RESTORE} 10

#試したこと
値をダブルクォートからシングルクォートで括るなど試したが、値の中の変数が展開されないか同様のエラーが出るなど改善されない。

#補足情報(FW/ツールのバージョンなど)
Red Hat Enterprise Linux Server release 7.5 (Maipo)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

とりあえず

echo ${CMD_RESTORE} #${CMD_RESTORE}

やってみたあとで

CMD_RESTORE="psql -h ${DB_HOST} -U ${DB_USER} -d ${DB_NAME} -p ${DB_PORT} -c "'"select pg_create_restore_point('${RESTORE_NAME}')"'

と比べてみたらどうだろう

投稿2018/10/31 15:15

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jusco870103

2018/11/01 00:44

ご回答頂き、ありがとうございます。 まずは、とevalを使って展開したところ、正常に動作できました。 展開できない変数がまたあった場合、参考にさせて頂きます。
guest

0

ベストアンサー

eval ${CMD_RESTORE}ですかね。

投稿2018/10/31 14:44

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jusco870103

2018/11/01 00:42

CMD_RESTORE="psql -h ${DB_HOST} -U ${DB_USER} -d ${DB_NAME} -p ${DB_PORT} -c \"select pg_create_restore_point(${RESTORE_NAME})\"" ↑にした状態で eval ${CMD_RESTORE}を実行したら正常にリストアポイントが作成できました! evalというコマンドがあることも知らず、数時間苦戦しておりました… ありがとうございました!
otn

2018/11/01 00:46

変数展開の後には、引用符処理が為されず、単に空白で区切られるので、 シェルの構文解析からやり直すevalコマンドを使って、引用符によるくくり処理を行わせます。 evalを使うと、ケースによっては訳の分からない事になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問