如何基于动态列表实现Shell交互选择菜单以选择可用网卡接口
优化后可运行的Shell网卡选择菜单实现
原有代码问题说明
- 数组索引默认从0开始,打印的选项序号不符合日常使用的1开头规则
- case语句逻辑冗余且存在语法错误:无效选项提示字符串未闭合,且第一个分支无条件匹配所有输入,无法触发无效判断
- 未做数组长度判断,单网卡场景也会弹出选择菜单,不符合需求
- 多余的for循环打印选项,select内置会自动格式化输出选项列表
完整可运行代码
host_interfaces() { # 获取状态为UP的网卡列表,过滤输出中可能附带的冒号 arr=($(ip ad | awk '/state UP/ {gsub(/:/,"",$2); print $2}')) local arr_len=${#arr[@]} # 无可用UP网卡的异常处理 if [ $arr_len -eq 0 ]; then echo "Error: No active network interface found." unset HOST_INTERFACE return 1 fi # 单网卡场景直接自动赋值 if [ $arr_len -eq 1 ]; then export HOST_INTERFACE=${arr[0]} echo "Only one active device detected: ${HOST_INTERFACE}, auto selected." return 0 fi # 多网卡场景弹出选择菜单 echo "Multiple devices detected, please select one from the list:" PS3='Please enter your choice: ' select opt in "${arr[@]}" do # 判断是否选择了有效选项 if [ -n "$opt" ]; then echo "You have selected device $opt" export HOST_INTERFACE=$opt break else echo "Invalid option, please enter the correct serial number." fi done } # 调用示例,执行后可直接使用$HOST_INTERFACE变量 host_interfaces
功能说明
- 单网卡场景:自动识别赋值,无需用户操作
- 多网卡场景:自动按1、2、3序号列出所有UP状态网卡,输入对应序号即可选择,输入非有效序号会提示重新输入,支持任意数量的动态选项
- 无可用UP网卡场景:抛出错误提示,清空变量避免后续逻辑异常
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

