【问题标题】:find ip address of my system for a particular interface with shell script (bash)使用 shell 脚本 (bash) 为特定接口查找我的系统的 IP 地址
【发布时间】:2013-10-14 00:35:44
【问题描述】:

我正在尝试通过 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 

【问题讨论】:

  • 考虑通过获取ip 来简化此操作以产生更多可解析的输出;例如,ip -f inet -o addr show dev wlan0

标签: linux bash shell sed awk


【解决方案1】:

让我们先清理您的代码。当您已经在使用 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

【讨论】:

  • pi@raspberrypi ~/attendance $ sh ip.sh ip.sh: 14: [: 非法号码:
  • @Ayushjoshi - 你跑什么来得到那个错误信息?同样,按照我的要求更新您的问题,尤其是使用ip addr 输出,否则我既不能测试也不能调试我发布的任何脚本。我怀疑你的 shell 脚本中有一些东西你还没有向我们展示(可能是一个不匹配的引用),这就是导致你的错误的原因 - 将你的脚本更新为尽可能小,但仍然会产生错误消息,然后发布整个脚本。
  • 最好还是写成ip addr show dev wlan0 | awk -F'[ /]*' '/inet /{print $3}',我想。让ip 只为您提供您想要的界面...
  • idk,我从不使用ip 命令,它在我的cygwinSolaris 安装中不可用,所以我不知道它的输出是什么样的。正如我在回答中提到的那样,如果他需要帮助编写 awk 脚本来解析它,则完全由 OP 发布他的 ip 命令的输出。
  • ip 地址 | awk ' /inet/ { ip[$NF] = $2; sub(/\/.*$/,"",ip[$NF]) } END { print ("eth0" in ip ? ip["eth0"] : ip["wlan0"] ) } ' > /home/ pi/att/ip.txt 是的,它成功了,我已经用这么多的东西替换了我的完整脚本,非常感谢@Ed Morton
【解决方案2】:

这是获取 IP 地址的好方法。这会为您提供测试时用于访问互联网的地址,因此即使您从 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=" ")

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 2010-10-25
    • 2011-04-06
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多