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

Meh*_*dad 3 command-line scripts environment-variables

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

arp -i eth0 -a
Run Code Online (Sandbox Code Playgroud)

上面命令的输出是:

? (10.42.0.38) at b8:27:eb:07:5d:60 [ether] on eth0
Run Code Online (Sandbox Code Playgroud)

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

hee*_*ayl 5

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

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

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

addrs=( $(arp -ni eth0 | grep -o '^[0-9][^ ]*') )
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

你也可以使用sed

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

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


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

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

或者

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