【问题标题】:checking if a variable value is null on bash script检查bash脚本上的变量值是否为空
【发布时间】:2013-01-29 13:55:44
【问题描述】:

我有这个脚本,它从 SQL 查询中检索一个参数(一个数字)并将其分配给一个变量。 有两个选项 - SQL 查询找到一个值,然后脚本执行 echo "billcycle number is $v_bc",或者它没有找到一个值,它假设 回显“未找到账单周期参数”。 我的 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 参数为

没有选择任何行”。

有什么建议吗?

非常感谢 阿萨夫。

【问题讨论】:

    标签: sql unix null if-statement


    【解决方案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?

    【讨论】:

      【解决方案2】:

      尝试在 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】:

        试试类似的东西

        if [ "${v_bc:-SHOULDNTHAPPEN}" = "SHOULDNTHAPPEN" ]; then
          echo no billcycle parameter found
        else......
        

        【讨论】:

        • 你好。非常感谢您的回复。您建议的代码确实给出了与 if [ -z "$v_bc" ]; 相同的结果。然后回显没有找到 billcycle 参数。你介意解释一下它的作用吗?并没有真正得到 SHOULDNTHAPPEN 部分(:
        【解决方案4】:

        如果变量为空,则将值分配给变量的惯用方法是在参数扩展中使用=。换句话说,这是:

        : ${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 是空字符串,而在于它是一个您不期望的值。)

        【讨论】:

          猜你喜欢
          • 2012-02-05
          • 1970-01-01
          • 1970-01-01
          • 2011-03-20
          • 2021-05-12
          • 1970-01-01
          相关资源
          最近更新 更多