dポイントプレゼントキャンペーン実施中!

oracleにアクセスするシェルを作成しており、期間指定の部分を変数で
指定したいと思っています。

しかしシングルクォーテーションに囲まれた部分の扱い方がよくわからず、
やむを得ず、変数内にクォーテーションを持たせ対処しました。
具体的には【現状】に示すようなコードです。


【現状】でも動くには動くのですが、将来的にはシェルの引数として
渡して実行したい為、出来れば変数内にはクォーテーションを持たせず
【希望】に示すイメージのコードにしたいと思っています。


単にエスケープの仕方の問題のような気がしているのですが、
なかなかうまくいきません。
変数の定義の部分が【希望】のとおりであれば、SQL部分の文字列は
多少変えてしまっても問題ありません。

シェル内で「'」に囲まれた部分への変数の展開させる方法、
これを教えてください。

よろしくお願いします。


--【現状】-------------------------------------
FROM_DATETIME="'2010-10-10 00:00:00'"
TO___DATETIME="'2010-12-10 00:00:00'"

sqlplus scott/tiger@oracle << EOT
select count(*)
from tablename
where columnname between
to_date(${FROM_DATETIME}, 'YYYY-MM-DD HH24:MI:SS') and
to_date(${TO___DATETIME}, 'YYYY-MM-DD HH24:MI:SS')
/
quit
EOT
-----------------------------------------------

--【希望】-------------------------------------
FROM_DATETIME=2010-10-10 00:00:00
TO___DATETIME=2010-12-10 00:00:00

sqlplus scott/tiger@oracle << EOT
select count(*)
from tablename
where columnname between
to_date(\'${FROM_DATETIME}\', 'YYYY-MM-DD HH24:MI:SS') and
to_date(\'${TO___DATETIME}\', 'YYYY-MM-DD HH24:MI:SS')
/
quit
EOT
-----------------------------------------------

A 回答 (2件)

> FROM_DATETIME=2010-10-10 00:00:00


> TO___DATETIME=2010-12-10 00:00:00

これは
環境変数FROM_DATETIMEを2010-10-10に(一時的に)設定→ 00:00:00 コマンドを実行
と解釈されます。(00:00:00などというコマンドはおそらく無いので、エラーになります)
FROM_DATETIME="2010-10-10 00:00:00"
FROM_DATETIME='2010-10-10 00:00:00'
FROM_DATETIME=2010-10-10\ 00:00:00
など、空白が変数にセットする値の一部であることを明示する必要があります。

これは
> シェルの引数として渡して実行したい
場合でも同じです。
(この「シェル」が「シェルスクリプト」だとして)

foo.sh 2010-10-10 00:00:00 2010-12-10 00:00:00
としたら
$1:2010-19-10
$2:00:00:00
$3:2010-12-10
$4:00:00:00
となります。$1が2010-10-10 00:00:00になるようにするには、
foo.sh "2010-10-10 00:00:00" "2010-12-10 00:00:00"
foo.sh '2010-10-10 00:00:00' '2010-12-10 00:00:00'
foo.sh 2010-10-10\ 00:00:00 2010-12-10\ 00:00:00
等とする必要があります。あるいは、前のコマンドラインのまま
FROM_DATETIME="$1 $2"
TO___DATETIME="$3 $4"
とするか。


今のを直すなら
FROM_DATETIME='2010-10-10 00:00:00'
TO___DATETIME='2010-12-10 00:00:00'
# このシングルクオートは「ひとまとめ」にするためのもので、
# 変数の中にはシングルクオート自体は含まれない。
# ダブルクォートでも(今回は展開されるような記述がないので)同等。
# \による空白のエスケープでも同等

to_date('${FROM_DATETIME}', 'YYYY-MM-DD HH24:MI:SS') and
to_date('${TO___DATETIME}', 'YYYY-MM-DD HH24:MI:SS')
# ヒアドキュメントの中のシングルクオートは特殊な意味のないただの文字なので、エスケープは不要

でいいはずです。
    • good
    • 0
この回答へのお礼

直接的な回答だけでなく、対処方法のバリエーションを
いくつか教えていただき参考になしました。

>ヒアドキュメントの中のシングルクオートは
>特殊な意味のないただの文字なので、エスケープは不要

特にこれも勉強になりました。

No.1さんのご回答で直面している問題自体は回避できたのですが、
いろいろ勉強になりました。ありがとうございました。

お礼日時:2010/11/25 10:11

まず、


>FROM_DATETIME=2010-10-10 00:00:00
>TO___DATETIME=2010-12-10 00:00:00
これができないですね。
FROM_DATETIME="2010-10-10 00:00:00"
TO___DATETIME="2010-12-10 00:00:00"
のように"か'で囲まないと。

これでできますよ。
FROM_DATETIME="2010-10-10 00:00:00"
TO___DATETIME="2010-12-10 00:00:00"
sqlplus scott/tiger@oracle << EOT
set echo on
select count(*)
from msn3
where dcol between
to_date('${FROM_DATETIME}', 'YYYY-MM-DD HH24:MI:SS') and
to_date('${TO___DATETIME}', 'YYYY-MM-DD HH24:MI:SS')
/
quit
EOT
    • good
    • 0
この回答へのお礼

おっと。これでいいんですか。どこでつまづいているかすら
きちんと把握できていなかったようですね。
助かりました。ご回答ありがとうございました。

お礼日時:2010/11/25 10:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!