![将连接到接口的 IP 地址设置为 shell 变量的脚本](https://linux22.com/image/1051639/%E5%B0%86%E8%BF%9E%E6%8E%A5%E5%88%B0%E6%8E%A5%E5%8F%A3%E7%9A%84%20IP%20%E5%9C%B0%E5%9D%80%E8%AE%BE%E7%BD%AE%E4%B8%BA%20shell%20%E5%8F%98%E9%87%8F%E7%9A%84%E8%84%9A%E6%9C%AC.png)
我想编写一个脚本,将连接到“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