将连接到接口的 IP 地址设置为 shell 变量的脚本

将连接到接口的 IP 地址设置为 shell 变量的脚本

我想编写一个脚本,将连接到“eth0”等接口的设备的 IP 地址设置为变量。我可以通过以下命令获取 IP 地址:

arp -i eth0 -a

上述命令的输出是:

? (10.42.0.38) at b8:27:eb:07:5d:60 [ether] on eth0

我想向.bashrc文件添加一个脚本,将上述命令输出的 IP 地址设置为变量$RASPBERRY_IP并在其他脚本中使用它。有什么想法吗?

答案1

arp操纵内核 ARP 缓存中的条目,您可能会得到很多条目(取决于 LAN 的大小)。由于您只对 IP 地址感兴趣,因此您应该使用该-n选项,以便arp首先显示数字地址而不是主机名。

此外,您通常会根据 LAN 的大小获得很多 IP 地址,因此您应该使用数组而不是变量来存储 IP 地址。

以下命令从arp缓存中取出 IP 地址并将其放入数组中addrs

addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )

以下是一个例子:

$ addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )

$ echo "${addrs[0]}"  ## First IP
192.168.2.27

$ echo "${addrs[2]}"  ## Second IP
192.168.1.1

$ echo "${#addrs[@]}"  ## Number of IP addresses
37

sed也可以使用:

addrs=( $(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*/\1/p') )

IP 地址将显示在第一列,我们通过提取第一列[0-9][^ ]*^[0-9]这是为了确保行以数字开头,因此包含标题的第一行将从输出中丢弃。


另一方面,如果您只有一个条目,则可以将其保存在变量中:

addr="$(arp -ni eth0 | grep -o '^[0-9][^ ]*')"

或者

addr="$(arp -ni eth0 | sed -nr 's/^([0-9][^ ]*).*/\1/p')"

答案2

这是另一个想法awk

arp -ni eth0 | awk 'NR>1 {print $1}'

例子

$ arp -ni eth0 | awk 'NR>1 {print $1}'
192.168.20.3
192.168.20.1
192.168.20.11

或者使用变量

$ addresses=$(arp -ni eth0 | awk 'NR>1 {print $1}')
$ echo $addresses
192.168.20.3 192.168.20.1 192.168.20.11

不使用数组来获取特定索引

$ arp -ni eth0 | awk -v idx=3 'NR>1 && NR==idx+1 {print $1}'
192.168.20.11

为了获得最大值idx

arp -ni eth0 | awk 'NR>1 {idx_max++} END {print idx_max}'

例子

$ idx_max=$(arp -ni eth0 | awk 'NR>1 {idx_max++} END {print idx_max}')
$ echo $idx_max
3

相关内容