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在网络接口连接时触发脚本,无需持续轮询:
- 创建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"
- 重新加载udev规则:
sudo udevadm control --reload-rules sudo udevadm trigger
方案2:systemd服务后台运行(持续监控)
若需持续监控接口状态,可创建systemd服务:
- 创建服务文件
/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
- 启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable rename-network-interface.service sudo systemctl start rename-network-interface.service
内容的提问来源于stack exchange,提问作者shreyas S
相关产品推荐
相关产品推荐

