You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本第8行出现Bad substitution错误的排查与解决请求

解决Shell脚本Bad substitution错误并实现网络接口连接时自动运行

错误原因与修复

第8行的${exclude_interfaces[$*]}是错误语法——exclude_interfaces是字符串变量而非数组,这种写法会触发"Bad substitution"报错。以下是修复并优化后的完整脚本:

#!/bin/bash
# 改用数组存储排除接口,避免字符串匹配歧义
exclude_interfaces=("enp0s31f6" "lo" "wlp2s0")

while true; do
  # 遍历目录路径获取接口名,替代ls命令避免潜在问题
  for interface_path in /sys/class/net/*; do
    interface="${interface_path##*/}"
    
    # 检查当前接口是否在排除列表中
    skip=0
    for exclude in "${exclude_interfaces[@]}"; do
      if [[ "$exclude" == "$interface" ]]; then
        skip=1
        break
      fi
    done
    [[ $skip -eq 1 ]] && continue

    # 读取接口连接状态,用read替代cat减少进程开销
    if read -r carrier < "/sys/class/net/$interface/carrier" && [[ "$carrier" -eq 1 ]]; then
      new_name="eth044"
      
      # 修复ip命令中的多余空格问题,确保变量传递正确
      sudo ip link set dev "$interface" down
      sudo ip link set dev "$interface" name "$new_name"
      sudo ip link set dev "$new_name" up

      echo "Interface name $interface changed successfully to $new_name."
      
      # 若只需修改一次连接接口,可添加exit退出循环
      # exit 0
    fi
  done
  
  sleep 1
done

关键修改点

  • 将排除接口改为数组存储,避免字符串匹配时的子串歧义
  • 替换ls /sys/class/net为目录遍历,适配含空格的接口名场景
  • 用循环匹配排除列表,比正则匹配更精准
  • 优化接口连接状态读取方式,降低系统资源消耗
  • 移除ip命令中变量的多余空格,避免命令识别错误

实现自动运行

方案1:udev规则触发(推荐,事件驱动更高效)

通过udev在网络接口连接时触发脚本,无需持续轮询:

  1. 创建udev规则文件/etc/udev/rules.d/99-rename-network-interface.rules:
ACTION=="change", SUBSYSTEM=="net", ATTR{carrier}=="1", ENV{INTERFACE}!="enp0s31f6", ENV{INTERFACE}!="lo", ENV{INTERFACE}!="wlp2s0", RUN+="/绝对路径/你的脚本.sh"
  1. 重新加载udev规则:
sudo udevadm control --reload-rules
sudo udevadm trigger

方案2:systemd服务后台运行(持续监控)

若需持续监控接口状态,可创建systemd服务:

  1. 创建服务文件/etc/systemd/system/rename-network-interface.service:
[Unit]
Description=Rename connected network interfaces
After=network.target

[Service]
ExecStart=/绝对路径/你的脚本.sh
Restart=always
User=root
WorkingDirectory=/tmp

[Install]
WantedBy=multi-user.target
  1. 启用并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable rename-network-interface.service
sudo systemctl start rename-network-interface.service

内容的提问来源于stack exchange,提问作者shreyas S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 09:07:40