【Shell实战案例面试题】输入网卡的名字,来输出网卡的IP

1.问题

  • 参数后判断要加""

  • 名字为空时显示ip

2.分析

  • 把本机的所有网卡名列出来,来引导用户输入

  • 使用命令列出所有网卡信:ifconfig/ip a

  • 设计一个函数,把网卡名作为参数,函数返回网卡的IP

  • 在获取某个网卡IP时,考虑网卡有多个IP地址(或为空IP的网卡)

3.实现

①添加网卡

②查看结果

③配置IP地址

[root@openEuler1 ~]# nmcli connection modify ens160 +ipv4.addresses 1.1.1.1/24
[root@openEuler1 ~]# nmcli connection modify ens160 +ipv4.addresses 2.1.1.1/24
[root@openEuler1 ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@openEuler1 ~]# nmcli connection show
NAME    UUID                                  TYPE      DEVICE
ens160  cf671928-9983-4a0f-8cf9-10ff6ddedb19  ethernet  ens160
[root@openEuler1 ~]# nmcli connection add type ethernet con-name ens224 ifname ens224                                                                   Connection 'ens224' (c11362f7-baa3-48be-98e4-d3e3e9d7b13a) successfully added.
[root@openEuler1 ~]# nmcli connection modify ens224 ipv4.addresses 10.10.10.10/24
[root@openEuler1 ~]# nmcli connection up ens224
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

④取网卡名、IP地址代码

#方法一
[root@openEuler1 ~]# ip a | awk -F"[: ]" '/[0-9]+:/ {print $3}' | grep -v "^$"
lo
ens160
ens224
ens256
#方法二
[root@openEuler1 ~]# ifconfig | awk -F":" '/^[a-z]+/ {print$1}'
ens160
ens224
ens256
lo
[root@openEuler1 ~]# ip address show ens160 | tr -s " " | awk -F"[ /]" '/inet / {print $3}'
192.168.126.140
1.1.1.1
2.1.1.1

 ⑤实现脚本代码

[root@openEuler1 ~]# vim ms1.sh
#!/bin/bash

ip a | awk -F"[: ]" '/^[0-9]+:/ {print $3}' > interface.txt

get_ip()
{
        if [ -n "$interface" ]
        then
                if grep -qw $interface interface.txt
                then
                        ip a s $interface | tr -s " " | awk -F"[ /]" '/inet / {print $3}'
                break
                else
                        echo "输入接口名错误"
                continue
                fi
        else
                echo "输入不能为空"
        continue
        fi
}

while true
do
        read -p "请输入网络接口名:" interface
        get_ip
done

rm-rf interface.txt
[root@openEuler1 ~]# chmod a+x ms1.sh
[root@openEuler1 ~]# ./ms1.sh

⑥结果

 注意:这个脚本会报break和continue的错,但并没有影响结果

4.改进代码

①代码

[root@openEuler1 ~]# vim ms1.sh
#!/bin/bash

# 获取所有网络接口名称并显示给用户
get_interfaces() {
    echo "请选择以下网络接口之一以获取其 IP 地址:"
    ip link show | awk -F: '/^[0-9]+: / {print $2}' | tr -d ' '
}

# 根据网络接口名称获取 IP 地址
get_ip_for_interface() {
    local interface=$1
    # 使用 ip 命令而不是 ifconfig,因为 ifconfig 在某些新系统上可能已被弃用
    ip a s $interface | tr -s " " | awk -F"[ /]" '/inet / {print $3}'
}

# 主程序
main() {
    local interface
    # 调用函数显示所有网络接口
    get_interfaces

    # 循环直到用户输入有效的网络接口名称或选择退出
    while true; do
        # 读取用户输入
        read -p "请输入网络接口名或输入 exit 退出: " interface
        # 退出条件
        if [ "$interface" == "exit" ]; then
            break
        fi

        # 检查输入是否为空
        if [ -z "$interface" ]; then
            echo "输入不能为空,请重新输入。"
            continue
        fi

        # 调用函数获取并显示 IP 地址
        ips=$(get_ip_for_interface "$interface")
        if [ -z "$ips" ]; then
            echo "网络接口 $interface 没有找到 IP 地址。"
        else
            echo "网络接口 $interface 的 IP 地址是:"
            echo "$ips"
        fi
    done
}

# 执行主程序
main

②结果

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值