Bash 'if' statement in 'for' loop in an 'if' statement
Bash 'if' statement in 'for' loop in an 'if' statement
我无法让下面的代码工作。
代码:
#!/bin/bash
ip=
first=
last=
if (( $first >= 1 && $first <= 255 && $last >= 1 && $last <= 255 && $first <= $last)); then
range=0
else
range=1
fi
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0]$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
VIP=0
else
VIP=1
fi
if (( $range == 0 && $VIP == 0)); then
echo "intiating ping scan for $first-$last"
echo ""
echo "==================================================="
for i in $(seq $first $last); do ping -c 1 ${ip[0]}.${ip[1]}.${ip[2]}.$i > /dev/null;done
if [ $? -eq 0 ]; then
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is up"
else
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is down"
fi
else
echo "invalid IP or range"
echo "=================================================="
echo "Usage: ./ping_scan.sh <ip[must end in 0]{ex. 192.168.5.0}> "
echo "<start address {ex. 23}> <end address {ex. 254}>"
fi
问题围绕这个代码片段:
if (( $range == 0 && $VIP == 0)); then
echo "initiating ping scan for $first-$last"
echo ""
echo "==================================================="
for i in $(seq $first $last); do ping -c 1 ${ip[0]}.${ip[1]}.${ip[2]}.$i > /dev/null;done
if [ $? -eq 0 ]; then
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is up"
else
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is down"
fi
else
echo "invalid IP address or range"
echo "=================================================="
echo "Usage: ./ping_scan.sh <ip[must end in 0]{ex. 192.168.5.0}> "
echo "<start address {ex. 23}> <end address {ex. 254}>"
fi
我用set -x
证实了我的怀疑。我遇到的问题是我只收到来自被 ping 的最后一个 IP 地址的输出。
for
循环为每个 IP 地址 运行ning,完成,获取 $?对于最后一个 ping 的 IP 地址,然后脚本进入 if
语句并打印最终 IP 地址的状态。
我需要 for
循环到每个 IP 地址的 运行 和 if
语句到每个 IP 地址的 运行 并输出每个 IP 地址的状态。我知道这是可以做到的,我已经尝试了多种配置,但 none 似乎有效。
我该如何解决?
if
语句需要在循环内。
for i in $(seq $first $last)
do
ping -c 1 ${ip[0]}.${ip[1]}.${ip[2]}.$i > /dev/null
if [ $? -eq 0 ]; then
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is up"
else
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is down"
fi
done
我无法让下面的代码工作。
代码:
#!/bin/bash
ip=
first=
last=
if (( $first >= 1 && $first <= 255 && $last >= 1 && $last <= 255 && $first <= $last)); then
range=0
else
range=1
fi
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0]$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
VIP=0
else
VIP=1
fi
if (( $range == 0 && $VIP == 0)); then
echo "intiating ping scan for $first-$last"
echo ""
echo "==================================================="
for i in $(seq $first $last); do ping -c 1 ${ip[0]}.${ip[1]}.${ip[2]}.$i > /dev/null;done
if [ $? -eq 0 ]; then
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is up"
else
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is down"
fi
else
echo "invalid IP or range"
echo "=================================================="
echo "Usage: ./ping_scan.sh <ip[must end in 0]{ex. 192.168.5.0}> "
echo "<start address {ex. 23}> <end address {ex. 254}>"
fi
问题围绕这个代码片段:
if (( $range == 0 && $VIP == 0)); then
echo "initiating ping scan for $first-$last"
echo ""
echo "==================================================="
for i in $(seq $first $last); do ping -c 1 ${ip[0]}.${ip[1]}.${ip[2]}.$i > /dev/null;done
if [ $? -eq 0 ]; then
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is up"
else
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is down"
fi
else
echo "invalid IP address or range"
echo "=================================================="
echo "Usage: ./ping_scan.sh <ip[must end in 0]{ex. 192.168.5.0}> "
echo "<start address {ex. 23}> <end address {ex. 254}>"
fi
我用set -x
证实了我的怀疑。我遇到的问题是我只收到来自被 ping 的最后一个 IP 地址的输出。
for
循环为每个 IP 地址 运行ning,完成,获取 $?对于最后一个 ping 的 IP 地址,然后脚本进入 if
语句并打印最终 IP 地址的状态。
我需要 for
循环到每个 IP 地址的 运行 和 if
语句到每个 IP 地址的 运行 并输出每个 IP 地址的状态。我知道这是可以做到的,我已经尝试了多种配置,但 none 似乎有效。
我该如何解决?
if
语句需要在循环内。
for i in $(seq $first $last)
do
ping -c 1 ${ip[0]}.${ip[1]}.${ip[2]}.$i > /dev/null
if [ $? -eq 0 ]; then
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is up"
else
echo "${ip[0]}.${ip[1]}.${ip[2]}.$i is down"
fi
done