6

我正在尝试通过 shell 脚本查找我自己系统的 IP 地址并写入我的脚本内容的文本

#!/bin/bash

wifiip=$(ip addr | grep inet | grep wlan0 | awk -F" " '{print $2}'| sed -e 's/\/.*$//')

eth0ip=$(ip addr | grep inet | grep eth0 | awk -F" " '{print $2}' | sed -e 's/\/.*$//')

if [ "$eth0ip" == "0" ]; then

    echo "$eth0ip" | grep [0-9]$ > /home/pi/att/ip.txt

else 

    echo "$wifiip" | grep [0-9]$ > /home/pi/att/ip.txt

fi

并尝试做一些事情,例如如果一个接口未启动,则在 ip.txt 中打印另一个 ip

但它给

ip.sh: 14: [: unexpected operator 
4

2 回答 2

16

让我们先清理您的代码。当您已经在使用 awk 时,您不需要十几个不同的命令和管道链。这个:

wifiip=$(ip addr | grep inet | grep wlan0 | awk -F" " '{print $2}'| sed -e 's/\/.*$//')

可以简单地写成这样:

wifiip=$(ip addr | awk '/inet/ && /wlan0/{sub(/\/.*$/,"",$2); print $2}')

但是你的整个脚本可以写成一个 awk 命令。

我需要你用命令的一些示例输出来更新你的问题,ip addr给定输入你想要的 awk 命令的输出,并更清楚地解释你正在尝试做什么,以便向你展示正确的编写方法但是它可能是这样的:

ip addr | awk '
/inet/ { ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF]) }
END { print ( "eth0" in ip ? ip["eth0"] : ip["wlan0"] ) }
' > /home/pi/att/ip.txt
于 2013-10-07T12:47:17.687 回答
10

这是获取 IP 地址的好方法。这为您提供了用于在测试中访问 Internet 的地址,因此即使您从 Wifi 更改为 eth 或任何其他 IF 类型,它也会为您提供正确的 IP。

在此处查看更详细的帖子:Linux bash script to extract IP address

my_ip=$(ip route get 8.8.8.8 | awk '/8.8.8.8/ {print $NF}')

获取接口名称:

my_if=$(ip route get 8.8.8.8 | awk '/dev/ {f=NR} f&&NR-1==f' RS=" ")
于 2013-10-08T11:07:02.090 回答