从两个变量中形成一个 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