4

我有以下我正在尝试编写脚本的内容。我试图迎合混合报价以及 asterix 的需求而碰壁了。

这就是我所拥有的

cmd_1="/usr/local/nz/bin/nzsql -d ${SOURCE_DB} -c "
cmd_2="\"create external table '${EXTERNAL_PATH}${EXTERNAL_FILE}'"
cmd_3=" USING (QUOTEDVALUE 'DOUBLE' ESCAPECHAR '\' DELIM ',' TIMESTYLE '24HOUR' LOGDIR '${EXTERNAL_PATH}' ENCODING 'INTERNAL')"
cmd_4=" as select * from ${SOURCE_TABLE}\""
cmd=${cmd_1}${cmd_2}${cmd_3}${cmd_4}

当 echo'd 看起来不错并且实际上运行时复制并粘贴到命令行。

/usr/local/nz/bin/nzsql -d mydatDba -c "create external table '/datawarehouse/development/externaldata/output/EXT_mytable.csv' USING (QUOTEDVALUE 'DOUBLE' ESCAPECHAR '\' DELIM ',' TIMESTYLE '24HOUR' LOGDIR '/datawarehouse/development/externaldata/output/' ENCODING 'INTERNAL') as select * from mytable"

为了让它正确回显,我确实必须将 ${cmd} 用双引号括起来,对于看起来像这样的执行也是如此。

"${cmd}"

但是,当从 shell 脚本运行时,我收到:没有这样的文件或目录。我已经验证了所涉及的目录,正如我所提到的,实际上可以将生成的内容复制并粘贴到命令行,并且工作正常。

我只能假设在我的 echo 命令和错误中回显的内容实际上并不是正在执行的内容。

非常感谢您就如何获得“真实”命令的回显和/或我对引号的使用提出建议。

谢谢。

4

1 回答 1

6

使用内置eval命令:

eval "$cmd"
于 2013-04-15T23:50:46.247 回答