如何在Unix Shell变量中正确写入含set heading off的Oracle查询语句
正确的Shell脚本写法
首先修正你的脚本语法错误,以下是可运行的版本:
#!/bin/bash DB_CONN="sqlplus -s user/pass" # 将SQL语句(包含set命令)作为字符串赋值给QUERY变量 QUERY="set heading off select sysdate from dual;" # 使用命令替换执行查询并获取结果 RESULT=$(echo "$QUERY" | $DB_CONN) echo "$RESULT"
或者更推荐用Here String的方式,避免echo可能带来的转义问题:
#!/bin/bash DB_CONN="sqlplus -s user/pass" QUERY="set heading off select sysdate from dual;" RESULT=$($DB_CONN <<< "$QUERY") echo "$RESULT"
错误原因说明
你原脚本的问题在于:
- Shebang错误:
#!/usr/bin没有指定具体的Shell解释器,应该写成#!/bin/bash或#!/bin/sh - QUERY变量赋值错误:直接在
QUERY=后写{}块,Shell会将其解析为命令组而非字符串,导致里面的SQL语句被当成Shell命令执行,自然会出现from意外的语法错误 - RESULT变量赋值错误:没有使用命令替换
$(...),原写法RESULT=echo $QUERY | $DB_CONN不符合Shell赋值语法,会被解析为两个独立命令
额外优化建议
- 可以在SQL中加入
set feedback off和set trimspool on,进一步清理输出格式,避免多余空行:QUERY="set heading off feedback off trimspool on select sysdate from dual;" - 如果SQL语句较长,也可以使用Here Document直接传递给sqlplus,不需要存入变量:
RESULT=$($DB_CONN <<EOF set heading off feedback off trimspool on select sysdate from dual; EOF )
内容的提问来源于stack exchange,提问作者SEUNGJAE MOON
相关产品推荐
相关产品推荐

