【问题标题】:Why do I get an extra 0 on my script为什么我的脚本上多了一个 0
【发布时间】:2025-12-08 17:45:01
【问题描述】:

我不知道为什么我在运行我的脚本时会得到一个额外的0

这是我的脚本:我运行一个 SQL 查询并将其保存为一个文件 valor.txt

这是我的数组:array=(50 60 70)

Valor.txt:

 count | trn_hst_id | trn_msg_host
-------+------------+--------------
    11 |         50 | Aprobada
     2 |         70 | Aprobada
(2 rows)

代码:

function service_status {
    cd
    cat valor.txt | grep $1 | gawk '{print $1}' FS="|" | sed "s/ //g"
    if [ $? -eq 0 ]; then
        echo -n 0
        else
        echo -n $1
    fi
}

        echo "<prtg>"

# <-- Start
        for i in "${array[@]}"
        do

        echo -n "   <result>
       <channel>$i</channel>
       <value>"
        service_status $i
        echo "</value>
       </result>"
       done
# End -->
       echo "</prtg>"
       exit

这是我的输出。

<prtg>
   <result>
       <channel>50</channel>
       <value>11
0</value>
       </result>
   <result>
       <channel>60</channel>
       <value>0</value>
       </result>
   <result>
       <channel>70</channel>
       <value>2
0</value>
       </result>
</prtg>

为什么我在这里得到0? ——

       <value>2
0</value>

【问题讨论】:

  • array 中的值是什么? valor.txt 里面有什么?据推测,您的管道正在产生价值,那么您正在做echo -n 0
  • 我认为是cat valor.txt | grep $1 | gawk '{print $1}' FS="|" | sed "s/ //g"的输出。不知道为什么你有那个命令序列,然后还有基于$?echo 语句。
  • @TomFenech 抱歉,现在已经更新了
  • @cxw 是的,我得到了正确的输出,我试图将 trn_hst_id 的计数放在值 TAG 上,但是当值 0 时,我总是在正确结果后得到 0 值
  • 谢谢 - 我认为my answer 会起作用。实际上,您总是得到一个 0 - &lt;value&gt;0&lt;/value&gt; for 60 来自 if 语句。 :)

标签: linux bash shell if-statement grep


【解决方案1】:

如果我正确理解您的评论,您想打印计数。这是count 列的值,如果存在于valor.txt 中,或者如果array 中的trn_hst_id 不在valor.txt 中,则为0。这应该有效(尽管未经测试):

function service_status {
    val=$(cat ~/valor.txt | grep $1 | gawk '{print $1}' FS="|" | sed "s/ //g")
        #     ^^ so you don't need to "cd" each time
        # Save the value into "$val"
    echo -n "${val:-0}"     # If there is nothing in $val, print a 0
}

"${val:-0}" 序列扩展为 "$val",如果 $val 中有文本,否则扩展为文字 0。如果$1 不在valor.txt 中,$val 将为空,因此您将得到一个零。有关:- 和朋友如何工作的更多信息,请参阅the wiki

【讨论】:

    【解决方案2】:

    “0”是echo -n 0 在函数内部执行的结果,以防awk 命令正常工作(通常是这种情况)。 从代码中不清楚为什么要这样写。很明显,应该从文件中提取某些值,但“if”条件似乎检查了错误的东西,我敢打赌“sed”的返回码不是预期的。 (更好的候选者是 'grep' 的返回码。

    所以我会这样写函数:

    function service_status {
        cd
        var=$(cat valor.txt | grep $1 | gawk '{print $1}' FS="|" | sed "s/ //g")
        if [ -z "$var" ]; then
            echo -n 0
        else
            echo -n "$var"
        fi
    }
    

    变量“var”将包含“搜索命令”的结果。如果搜索不返回任何值,则“var”将为空,“0”将是函数的输出,否则“var”的内容将在输出中。

    【讨论】:

      最近更新 更多