Shell Sqlplus脚本部分显示“位置不正确()”错误

Shell Sqlplus脚本部分显示“位置不正确()”错误,shell,sqlplus,io-redirection,csh,Shell,Sqlplus,Io Redirection,Csh,我正在写脚本,在尝试从表中获取日期时遇到问题。我无法将其存储到变量中。我总是会出错: 位置不好的 变量时间段是D,shell实际上进入IF,密码也不是问题,因为我使用它手动连接并检查查询,这里没有问题 这是脚本中我遇到问题的部分 #!/bin/csh -f if ( $TIMEFRAME == "D" ) then set TIMEBEG = `sqlplus -s $PASSWORD << EOF \ set head off; \ set feed off; \

我正在写脚本,在尝试从表中获取日期时遇到问题。我无法将其存储到变量中。我总是会出错: 位置不好的

变量时间段是D,shell实际上进入IF,密码也不是问题,因为我使用它手动连接并检查查询,这里没有问题

这是脚本中我遇到问题的部分

#!/bin/csh -f
if ( $TIMEFRAME == "D" ) then
   set TIMEBEG = `sqlplus -s $PASSWORD << EOF \
   set head off; \
   set feed off; \
   select to_char(trunc(sysdate) - 1,'YYYYMMDD') from dual; \
   exit; \
EOF`
set TIMEEND = $TIMEBEG"235959"
set TIMEBEG = $TIMEBEG"000000"
endif
我还试图把它存储在一个文件中,同样的问题

#!/bin/csh -f
set tmp_file=/tmp/tmp.$$
if ( $TIMEFRAME == "D" ) then
   sqlplus -s $PASSWORD > $tmp_file << EOF \
   set head off \
   set feed off \
   select to_char(trunc(sysdate) - 1,'YYYYMMDD') from dual; \
   exit; \
EOF
set TIMEBEG=`cat $tmp_file`
set TIMEEND = $TIMEBEG"235959"
set TIMEBEG = $TIMEBEG"000000"
endif
我尝试了不同的解决方案,但对于同一个问题,尝试了没有分号,没有集合,把它放在一行上,我没有想法

当尝试使用-xvf时,这是我进入零件时得到的结果:

if ( $TIMEFRAME == "D" ) then
if ( D == D ) then
sqlplus -s $PASSWORD > $tmp_file << EOF set head off set feed off select to_char ( trunc ( sysdate ) - 1,'YYYYMMDD' ) from dual ; exit ; EOF
Badly placed ()'s.

有什么想法吗?这是在Amazon Linux上运行的

我不确定您是否可以在C shell的backticks中使用here doc

将sqlplus输入写入文件,而不是写入整个sqlplus命令

#!/bin/csh -f
set tmp_file=/tmp/tmp.$$
if ( $TIMEFRAME == "D" ) then
    cat > $tmp_file <<EOF
    set head off
    set feed off
    select to_char(trunc(sysdate) - 1, 'YYYYMMDD') from dual;
    exit;
EOF
    set TIMEBEG = `sqlplus -s $PASSWORD < $tmp_file`
    set TIMEEND = $TIMEBEG"235959"
    set TIMEBEG = $TIMEBEG"000000"
endif

你为什么用csh编写脚本?因为我的工作,这就是为什么:你不需要反斜杠,是吗?我认为shell认为锚变量是EOF set head OF set feed OF select to_char trunc sysdate-1,dual中的'YYYYMMDD';出口EOF而不是您期望的EOF。我尝试了很多没有反斜杠的东西,但是我发布的第二个没有反斜杠的代码成功了:。谢谢大家。