私は通常、次SQLのように実行されるBashシェルスクリプトにインラインでステートメントを記述しますSQLPlus。
#! /bin/sh
sqlplus user/pwd@dbname<<EOF
insert into dummy1
select * from dummy2;
commit;
exit;
EOF
これは問題なく機能し、実行時に行を挿入しますdummy1。先日、私の同僚が以下のようなスクリプトで私に来ました(簡略化)
#! /bin/sh
sqlvar="insert into dummy1 select * from dummy2;commit;"
echo $sqlvar|sqlplus user/pwd@dbname
これに関する問題は、実行時に変数がsqlvar展開さ*れて現在のディレクトリ内のすべてのファイルになり、最終的に次のようにエラーが発生することです。
SQL> insert into dummy1 select <--all the file names in the current directory-->
from dummy2;commit
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
これに対する私たちの最初のスタンスは、シェルが*ワイルドカードコンテキストで解釈し、シェル変数の展開中にすべてのファイル名を一覧表示することでした(理由はよくわかりません.... ???)。それで、これを理解するために、私たちは以下のようなことをしました-
$ var="hello *"
$ echo $var
hello <--all the file names in the current directory-->
だが
$*
ksh: somefile.sh: 0403-006 Execute permission denied. #since it had no execute permission
ディレクトリには他にも多くのファイルがあり、なぜ*実行を選択したのsomefile.shか、またはを指しているのかわかりませんsomefile.sh。
その後、少し掘り下げて、使用set -o noglobするとこの問題が完全に解決されます。
#! /bin/sh
set -o noglob
sqlvar="insert into dummy1 select * from dummy2;\n commit;"
echo $sqlvar|sqlplus user/pwd@dbname
インターネット上で、いくつかの矛盾した、またはかなり矛盾したsettingの説明がnoglobあります。だから私は誰かがこのビットのちょっとしたコツを説明できるかどうか探しています。