結果が1行の時限定ですが。↓ クエリ末尾にセミコロンを付けず、メタコマンド\gsetを入力。何も表示されないので不安になるけど、ちゃんと列名 => 変数名になって格納されてます。変数の取り出しは「:変数名」で。
# select now() \gset
#
# \echo :now
2016-06-26 14:18:33.961906+09
↓ 変数の中身をクエリに使う例。数値なら「:変数名」そのまま、他の型でクォートが必要なものは「:'変数名'」とします。この際、型を指定しないとunknownなので注意。
# select :'now';
+-------------------------------+
|           ?column?            |
+-------------------------------+
| 2016-06-26 14:18:33.961906+09 |
+-------------------------------+
(1 row)

# select date :'now';
+------------+
|    date    |
+------------+
| 2016-06-26 |
+------------+
(1 row)
最初に書いたとおり、結果が1行の時のみ可。複数行あると ↓ メッセージが出るだけ。どうしても変数に入れたければ、クエリ側で配列にする方法があります。
# select * from generate_series(1, 9) as vals \gset
more than one row returned for \gset

# select array_agg(vals) from generate_series(1, 9) as vals \gset
#
# \echo :array_agg
{1,2,3,4,5,6,7,8,9}
↓ 列が複数あっても大丈夫。それぞれの列名がそのまま変数名になります。
# select chr(12354) as char1,
      chr(12436) as char2
  \gset
#
# \echo :char1
あ
# \echo :char2
ゔ
じゃあ、アドホックなクエリで同じ列名が複数ある場合は? 一番右の列の中身になります。変数の上書きと同じですね。
# select chr(12354) as char,
#     chr(12436) as char,
#     now()
# \gset
#
# \echo :char
ゔ
# \echo :now
2016-06-26 14:46:26.624577+09
psql変数の一覧は ↓ メタコマンド\setで出ます。不要な変数は\unsetで消去。
# \set
AUTOCOMMIT = 'on'
PROMPT1 = '# '
PROMPT2 = '# '
PROMPT3 = '>> '
...
ENCODING = 'UTF8'
now = '2016-06-26 14:46:26.624577+09'
array_agg = '{1,2,3,4,5,6,7,8,9}'
char1 = 'あ'
char2 = 'ゔ'
char = 'ゔ'
最後。シェルの環境変数にするには ↓ メタコマンド\setenvを併用します。第1パラメータが環境変数名、第2パラメータが先ほど\gsetで入れたpsql変数の展開。
# \setenv now :now
#
# \! echo $now
2016-06-26 14:46:26.624577+09
このシェル環境変数は、psqlを閉じるまで有効。任意のシェルコマンド実行(#!)と組み合わせて、いろいろ活用できます。