シェルスクリプトからpsqlテーブルレコードを取得するには?

シェルスクリプトからpsqlテーブルレコードを取得するには?

私はpostgresqlを持ち、10個のレコードを持つテーブルを持っているので、シェルスクリプトの10個のレコードに対して10個のローカル変数が必要です。

次の方法を試しましたが、list123[1]...list123[9]の代わりにlist123[0]変数にすべてのレコードを保存します。

declare -a list123
list123=( "$(psql -t -h 10.100.0.1 -U prasad statistics -c "select command from jobhandler.config_info where conf_name like '%stager%'")" )

list123[0-9]の各レコードに対応するレコードが必要です。

答え1

問題は、コマンドの置換に二重引用符を使用したために発生します$()。これは出力全体を単一の複数行文字列に変換します。

努力する:

declare -a list123
list123=( $(psql -t -h 10.100.0.1 -U prasad statistics -c "select command from jobhandler.config_info where conf_name like '%stager%'") )

あなたのテーブルはありませんが、単純なID、名前、dobテーブルを使用して私のシステムでテストしました。

$ list123=($(psql -t -c 'select dob from newtable'))
$ set | grep list123
list123=([0]="1967-03-07" [1]="1964-08-07" [2]="1992-10-19" [3]="1964-12-18" [4]="1945-12-26")

答え2

ご質問にご回答いただいているかどうかわかりません。 10個の文字列配列をローカル変数として使用しますか、または各文字列を含む10個のシェル変数を使用しますか?

後者には奇妙なトリックが必要です。

#!/bin/bash

COUNTER=1
eval $(psql -t -h 10.100.0.1 -U prasad statistics -c "select command from jobhandler.config_info where conf_name like '%stager%'" |
while read VAR
do
    echo "list123$COUNTER='$VAR'"
    ((COUNTER = COUNTER + 1))
done)

echo list1231="$list1231"
echo list1232="$list1232"

このバリアントは「list1231」、「list1232」、「list1233」...という名前のシェル変数を設定しますが、「list123」という配列シェル変数の他の要素は設定しません。

関連情報