我正在编写一个shell脚本,我需要将Teradata中的BTEQ查询结果转换为unix变量。
我试过了,
testabcd=$(bteq << EOF 2>&1 >> $LOG_FILE
.LOGON ${HOST}/${USER},${PASSWORD}
DATABASE ${SRC_DB};
.set width 2000;
.set titledashes off;
SELECT COUNT(*) FROM ${SRC_DB}.${SOURCE_TABLE};
.LOGOFF;
.QUIT;
.EXIT
EOF)
echo "The count is: " $testabcd
查询成功运行但变量未分配输出。有什么建议吗?
答案 0 :(得分:4)
问题在于重定向:
2>&1 >> $LOG_FILE
这实际上意味着&#34;将stderr和stdout发送到文件$ LOG_FILE&#34;。由于stderr和stdout被重定向,该命令不会向shell发送任何输出,因此命令替换不会捕获任何内容。例如:
$ test=$(echo "Hello" 2>&1)
$ echo $test
Hello // as expected
$ test2=$(echo "Hello" 2>&1 >> example.log)
$ echo $test2
// is empty, as output has been redirected
$ cat example.log
Hello // here is the redirected output
bteq
命令的输出将在$LOG_FILE
内找到 - 如果你想将它保存在变量中,那么你需要删除重定向:
testabcd=$(bteq << EOF 2>&1
....
答案 1 :(得分:2)
无需额外文件:
testabcd=$(bteq << EOF 2>&1 |grep '^>' |sed -e "s/^>//"
.LOGON ${HOST}/${USER},${PASSWORD}
DATABASE ${SRC_DB};
.set width 2000;
.set titledashes off;
SELECT '>'||COUNT(*) FROM ${SRC_DB}.${SOURCE_TABLE};
.LOGOFF;
.QUIT;
.EXIT
EOF)
'>'||COUNT(*)
:>
标记我们真正想要查询的输出。
grep '^>'
:过滤标记的文字。避免bteq
瑕疵。
sed -e "s/^>//"
:删除标记 >
。
答案 2 :(得分:0)
尝试这种方式:
testabcd(){
bteq << EOFBT |grep '^>' |sed -e "s/^>//"
.SET ERROROUT STDOUT
.SET ECHOREQ ON
.SET INDICDATA OFF
.SET QUIET OFF
.SET SIDETITLES OFF
.SET TIMEMSG QUERY
.SET TITLEDASHES OFF
.LOGON ${LOGIN_TD_DWC};
SELECT '>'||'ANTON';
.LOGOFF;
.QUIT;
EOFBT
}
var_test=$(testabcd)
echo $var_test
答案 3 :(得分:-1)
我无法找到将查询输出分配给变量的任何直接方法,而是必须将输出写入文件并读取它。
ERR_COUNT_FILE="err_count.txt"
cat null > $ERR_COUNT_FILE
bteq << EOF >>${LOG_FILE} 2>&1
.LOGON ${HOST}/${USER},${PASSWORD}
DATABASE ${SRC_DB};
.set titledashes off;
.set heading '';
.EXPORT FILE=${ERR_COUNT_FILE}
SELECT COUNT(*) from ${SRC_DB}.${SOURCE_TABLE};
.EXPORT RESET
EOF
sed -i '1d;s/[[:blank:]]//g' $ERR_COUNT_FILE /* Remove header line and all blank spaces from the file*/
count_err=$(cat ${ERR_COUNT_FILE})
echo $count_err
我找不到更简单的方法。
答案 4 :(得分:-1)
尝试使用:
count=$(echo "SELECT '>'||COUNT(*) FROM YOUR_DBNAME.YOUR_TABLENAME" | bteq .LOGON ${HOST}/${USER},${PASSWORD} 2>&1 |grep '^>' |sed -e "s/^>//");
使用这个,我们写一行 bteq查询,结果存储在变量count
中,因此可以使用。
无需额外的文件或其他任何内容。