【问题标题】:BASH: IF statement doesn't work with empty string from WHILE loopBASH:IF 语句不适用于 WHILE 循环中的空字符串
【发布时间】:2014-09-13 03:33:54
【问题描述】:

如果命令没有输出,第一个if 语句将不起作用。我也尝试评估退出状态,但这也不起作用?

unhide-tcp 输出:

# unhide-tcp 
Unhide-tcp 20130526
Copyright © 2013 Yago Jesus & Patrick Gouin
License GPLv3+ : GNU GPL version 3 or later
http://www.unhide-forensics.info
Used options: 
[*]Starting TCP checking

Found Hidden port that not appears in ss: 1025

Found Hidden port that not appears in ss: 1026
[*]Starting UDP checking

脚本:

#!/usr/bin/env bash

unhide-tcp | grep "^Found" | while IFS=":" read -a PORT; do

        if [ -z ${PORT[1]} ]; then

            echo "No hidden ports found."

        elif [ -n ${PORT[1]} ]; then

            echo ${PORT[@]}

        fi

done

【问题讨论】:

    标签: bash if-statement while-loop


    【解决方案1】:

    我认为您只需要:

    unhide-tcp | grep "^Found" || echo "No hidden ports found."
    

    它会打印像 Found Hidden port that not appears in ss: 1025 这样的行,如果找不到这些行,脚本会打印 "No hidden ports found." - 因为如果找不到匹配项,grep 会返回非零值。

    如果您想将端口输出压缩到一行,您可以使用sedreadarray 进行进程替换:

    readarray -t PORTS < <(exec unhide-tcp | sed -nr 's|^Found.*: ([0-9]+).*|\1|p')
    [[ ${#PORTS[@]} -gt 0 ]] && echo "${PORTS[@]}" || echo "No hidden ports found."
    

    它可以给出类似1025 1026No hidden ports found. 的输出。

    【讨论】:

      【解决方案2】:

      -z 等标志需要一个参数。在您的示例中,$PORT 变量的扩展可能为空白。将变量名用双引号括起来。

      如果 [ -z "${PORT[1]}" ];那么……

      【讨论】:

      • 感谢您的回复,但不幸的是这仍然不起作用。
      【解决方案3】:

      像这样使用awk 会更好:

      unhide-tcp | awk -F':' '/Found/ && NF==2{c++; print} END{if (c==0) print "No hidden ports found"}'
      

      当我在您的问题中显示的输入上使用它时,我得到以下输出:

      Found Hidden port that not appears in ss: 1025
      Found Hidden port that not appears in ss: 1026
      

      【讨论】:

      • 根据输出会有不同的操作,所以理想情况下我需要这些IF 语句。
      • 当然可以使用:unhide-tcp | awk -F': *' '/Found/{ if (NF&lt;2) print "No hidden ports found"; print $0 }'
      • 我刚刚测试过,如果没有任何隐藏端口,我也没有得到任何输出 awk
      • 我想我不明白你所说的隐藏端口是什么意思。您能否为隐藏端口显示 unhide-tcp 的示例输出?
      • 请参阅主要问题中的unhide-tcp output: 部分。
      猜你喜欢
      • 1970-01-01
      • 2021-10-24
      • 2021-06-13
      • 2017-09-05
      • 2022-11-28
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多