从两个变量中形成一个 IP
forming an IP out of two variables
如果问题不当,我先道歉。
我正在编写一个脚本,该脚本可以获取 IP 地址的前三个八位字节并将其发送到一个变量。
接下来我想使用该变量并在 for 循环中设置一个范围,但它不起作用。
这是我的代码;
device_ip=$(ip addr show eth1 | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.')
for i in {191..200};
do
printf device_ip | ping -c 1 "$device_ip""$i"
done
除了将两个变量组合到 ping 之外,它会执行所有操作。
输出;
sh myscript.sh
ping: unknown host x.x.x.
x.x.x.{191..200}
任何人都可以指出我正确的方向吗?
我哪里错了?
非常感谢,
Bash:
#!/bin/bash
device_ip="$(ip -o -4 a sh eth1|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.'|head -1)" # make sure you get only the first IP, in case eth1 returns more than 1
for i in {191..200}
do
echo pinging IP: ${device_ip}${i}
ping -c1 ${device_ip}${i}
done
这对我有用:
for ip in $device_ip.{191..200}; do ping -c 1 $ip; done
您可能没有使用 bash
吗?
检查您的 #!
shebang 行。如果您的第一行的前两个字符不是 #!
那么它只是一条评论。
此外,
printf device_ip | ping -c 1 "$device_ip""$i"
不会如您所愿。它将把字符串“device_ip”打印到 ping
的 STDIN 上,它不会读取它。完全删除 printf
语句,它没有任何用处并且混淆了代码。
此外,虽然这可行,但无缘无故地在视觉上有点嘈杂。 "$device_ip""$i"
在 "$device_ip$i"
处生成相同的输出,更易于阅读。也许更好,"${device_ip}${i}"
。不过,这只是一种风格偏好。
这是一个可能的解决方案:
device_ip=($(ip -o address show eth0 | grep -Eo '([0-9]{1,3}\.){3}'))
for address in ${device_ip[0]}{191..200}; do
ping -c 1 $address
done
这是使用 Bash 匹配运算符的替代方法:
if [[ $(ip -o address show eth0) =~ ([0-9]{1,3}\.){3} ]]; then
for address in ${BASH_REMATCH}{191..200}; do
ping -c 1 $address
done
fi
如果问题不当,我先道歉。 我正在编写一个脚本,该脚本可以获取 IP 地址的前三个八位字节并将其发送到一个变量。 接下来我想使用该变量并在 for 循环中设置一个范围,但它不起作用。
这是我的代码;
device_ip=$(ip addr show eth1 | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.')
for i in {191..200};
do
printf device_ip | ping -c 1 "$device_ip""$i"
done
除了将两个变量组合到 ping 之外,它会执行所有操作。 输出;
sh myscript.sh
ping: unknown host x.x.x.
x.x.x.{191..200}
任何人都可以指出我正确的方向吗? 我哪里错了?
非常感谢,
Bash:
#!/bin/bash
device_ip="$(ip -o -4 a sh eth1|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.'|head -1)" # make sure you get only the first IP, in case eth1 returns more than 1
for i in {191..200}
do
echo pinging IP: ${device_ip}${i}
ping -c1 ${device_ip}${i}
done
这对我有用:
for ip in $device_ip.{191..200}; do ping -c 1 $ip; done
您可能没有使用 bash
吗?
检查您的 #!
shebang 行。如果您的第一行的前两个字符不是 #!
那么它只是一条评论。
此外,
printf device_ip | ping -c 1 "$device_ip""$i"
不会如您所愿。它将把字符串“device_ip”打印到 ping
的 STDIN 上,它不会读取它。完全删除 printf
语句,它没有任何用处并且混淆了代码。
此外,虽然这可行,但无缘无故地在视觉上有点嘈杂。 "$device_ip""$i"
在 "$device_ip$i"
处生成相同的输出,更易于阅读。也许更好,"${device_ip}${i}"
。不过,这只是一种风格偏好。
这是一个可能的解决方案:
device_ip=($(ip -o address show eth0 | grep -Eo '([0-9]{1,3}\.){3}'))
for address in ${device_ip[0]}{191..200}; do
ping -c 1 $address
done
这是使用 Bash 匹配运算符的替代方法:
if [[ $(ip -o address show eth0) =~ ([0-9]{1,3}\.){3} ]]; then
for address in ${BASH_REMATCH}{191..200}; do
ping -c 1 $address
done
fi