我有这个脚本从SQL查询中检索一个参数(一个数字)并将其分配给一个变量。 有两个选项 - SQL查询找到一个值然后脚本预先形成 echo“billcycle number是$ v_bc”,或者它没有找到一个值,它假设为 echo“找不到billcycle参数”。 我对if条件有疑问。
这就是我想出的:
#!/bin/bash
v_bc=`sqlplus -s /@bscsprod <<EOF
set pagesize 0
select billcycle from bc_run
where billcycle not in (50,16)
and control_group_ind is null
and billseqno=6043;
EOF`
if [ -z "$v_bc" ]; then echo no billcycle parameter found
else echo "the billcycle parameter is $v_bc"
fi
当billseqno = 6043时,则表示v_bc = 25,当我运行脚本时,结果为: “billcycle参数是25”。这就是我要做的事情。 当我设置billseqno = 6042时,根据上面的SQL查询,v_bc将没有得到任何值,因此我想要它做的是echo“no billcycle parameter found”。 相反,我得到
“billcycle参数是
没有选择任何行“。
有什么建议吗?
非常感谢 阿萨弗。答案 0 :(得分:1)
您的代码正在检查空值 - v_bc
即使用-s
也不为空。
您可以:
在没有返回任何行时解析sqplus
的输出,所以添加:
if [[ "$v_bc" == "no rows were selected" ]]; then v_bc=""; fi
这使用带有“[[ ]]
”的bash ==
命令进行模式匹配,因此我们不需要担心前导/尾随空格。这不像dogbane的SET FEEDBACK OFF
那么强大,因为“没有选择任何行”完全有可能成为有效数据。
写一个总是返回数据的更好的查询,如下所示: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:594023455752#followup-221571500346463844
诀窍是重新构造您的查询并使用带有后备查询的select / union,当您的查询为空时有条件地提供输出:
with data as
(select billcycle from bc_run where [...])
select * from data
union all
select 'NA', null from dual where not exists (select null from data);
答案 1 :(得分:0)
尝试类似
的内容if [ "${v_bc:-SHOULDNTHAPPEN}" = "SHOULDNTHAPPEN" ]; then
echo no billcycle parameter found
else......
答案 2 :(得分:0)
尝试在sqlplus中关闭反馈,这样如果没有选择任何行,您就不会获得任何输出:
v_bc=`sqlplus -s /@bscsprod <<EOF
SET FEEDBACK OFF
set pagesize 0
select billcycle from bc_run
where billcycle not in (50,16)
and control_group_ind is null
and billseqno=6043;
EOF`
答案 3 :(得分:0)
如果该变量为空,则为变量赋值的惯用方法是在参数扩展中使用=
。换句话说,这个:
: ${v_bc:=no billcycle paramter found}
相当于:
test -z "$v_bc" && v_bc='no billcycle paramter found'
在您的情况下,它也很容易做到:
echo ${v_bc:-no billcycle parameter found}
但标题中提出的问题并不是您的问题。 (因为问题不是v_bc
是空字符串,而是它是你不期望的值。)