检查bash脚本上的变量值是否为null

时间:2013-01-29 13:55:45

标签: sql unix null if-statement

我有这个脚本从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参数是

     
    

没有选择任何行“。

  

有什么建议吗?

非常感谢 阿萨弗。

4 个答案:

答案 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);

(另见What is the dual table in Oracle?

答案 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是空字符串,而是它是你不期望的值。)