0

配列内でパイプコマンドを実行するにはどうすればよいですか?

例えば:

$ ORACLE_USER=user1
$ ORACLE_PASS=password
$ ORACLE_CONN=database1
$ ORACLE_EXPDP_JOB_NAME=expdp-job-name
$ ORACLE_SQLPLUS_BIN=/opt/oracle/product/10.2.0/client/bin/sqlplus
$ ORACLE_SQLPLUS_PARAMS=( -S "${ORACLE_USER}"/"${ORACLE_PASS}"@"${ORACLE_CONN}" )
$ CMD=( echo -e \"DROP TABLE "${ORACLE_USER}".'\"${ORACLE_EXPDP_JOB_NAME}\"'\;\\nCOMMIT\;\\n\" \| ${ORACLE_SQLPLUS_BIN} "${ORACLE_SQLPLUS_PARAMS[@]}" )

$ "${CMD[@]}"

これは以下を出力します:

"DROP TABLE user1.\"${ORACLE_EXPDP_JOB_NAME}\";
COMMIT;
" | /opt/oracle/product/10.2.0/client/bin/sqlplus -S user1/password@database1

評価を行うと、コマンドは正しく実行され、次のように表示されます。

$ eval "${CMD[@]}"
DROP TABLE user1."expdp-job-name"
                      *
ERROR at line 1:
ORA-00942: table or view does not exist

Commit complete.

ただし、結果の中にアスタリスク「*」があり、それを変数に格納したい場合、evalコマンドはアスタリスクを解釈し、結果全体を乱雑にします。

$ ls -l
total 2,1M
-rw-r--r-- 1 root root    0 2011-04-07 14:33 a.log
-rw-r--r-- 1 root root 186K 2011-04-06 12:05 DEBUG_AD.log
-rw-r--r-- 1 root root 1,7M 2011-04-06 10:38 REPORT.log
-rw------- 1 root root  57K 2011-04-06 10:38 sent

$ b=`eval "${CMD[@]}"`
$ echo $b
DROP TABLE user1."expdp-job-name" a.log DEBUG_AD.log REPORT.log sent ERROR at line 1: ORA-00942: table or view does not exist Commit complete.

あなたは見ましたか??-> a.log DEBUG_AD.log REPORT.logは、結果にアスタリスクが付いたときにevalによって解釈されるファイルです。アスタリスクの解釈なしで、結果が上記のようになることを望みました。

4

1 に答える 1

1

自分で解決!

アスタリスクの解釈をエスケープするには、変数を二重引用符でエコーするだけです。

echo "$b"
DROP TABLE user1."expdp-job-name"
                  *
ERROR at line 1:
ORA-00942: table or view does not exist

Commit complete.

ごめん!

于 2011-04-07T18:08:10.830 に答える