如何让 for 循环输出一次而不是每次迭代?

问题描述

我制作了这个简单的 bash 脚本来运行 ping 扫描并抓取我网络上活动的 MAC 地址,输出一个文件,然后将该文件一个包含我从 ARP 抓取的已知 MAC 地址列表的文件进行比较我的路由器中的表。

与其为迭代的每一行回显结果,不如让 for 循环吐出一个输出,例如“您的网络上的所有设备都熟悉”?

当前代码

sudo nmap -sn 192.168.0.0/24 | grep "MAC" | awk '{print $3}'| sort > $HOME/Desktop/arp.txt

readarray -t mac <$HOME/Desktop/arptable.txt

for address in "${mac[@]}"; do
    if grep -Fxq "$address" $HOME/Desktop/arptable.txt;
    then 
        echo "$address is a kNown network device"
    else
        echo "WARNING: $address is an unkNown device on the network"
    fi
done 

我当前的输出看起来像:

XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device
XXXXXXXXXXXXXXXXX is a kNown network device

免责声明:这只是一个项目,并没有用作严肃的安全工具。

解决方法

假设您仍然想打印出 WARNING 消息...跟踪成功的次数,如果等于数组 mac[] 中的条目数,则打印您想要的消息,例如:

found=0

for address in "${mac[@]}"; do
    if grep -Fxq "$address" $HOME/Desktop/arptable.txt;
    then 
        ((found++))
    else
        echo "WARNING: $address is an unknown device on the network"
    fi
done 

[[ "${found}" -eq "${#max[@]}" ]] && echo "All Devices are familiar on your network"

或者,如果您生成任何 WARNING 消息,请清除标记:

foundall=true

for address in "${mac[@]}"; do
    if ! grep -Fxq "$address" $HOME/Desktop/arptable.txt;
    then 
        echo "WARNING: $address is an unknown device on the network"
        foundall=false
    fi
done 

[[ "${foundall}" == 'true' ]] && echo "All Devices are familiar on your network"
,

伪代码(我不会 bash,不懂语法):

sudo nmap -sn 192.168.0.0/24 | grep "MAC" | awk '{print $3}'| sort > $HOME/Desktop/arp.txt

readarray -t mac <$HOME/Desktop/arptable.txt

# everythingGood = true
for address in "${mac[@]}"; do
    if grep -Fxq "$address" $HOME/Desktop/arptable.txt;
    then 
    else
        # everythingGood = false
        # some code here maybe to store which ones failed
    fi
done 

# if everythingGood
    # echo "All Devices are familiar on your network"
# else
    # echo "WARNING: $address is an unknown device on the network"