如何在Bash字符串中移除首尾字符?代码执行异常排查
问题分析与解决
你的脚本核心问题出在字符串截取的写法兼容性,以及可能存在的换行符干扰:
原脚本里的${MA:1: -1}是Bash 4.2及以上版本才支持的负长度截取语法,如果你的系统Bash版本较低,这个写法会失效,导致只跳过了第一个字符但没移除最后一个;另外bt-device -l的输出可能带有换行符,也会打乱截取逻辑。
修复方案
方案1:用POSIX兼容的字符串截取(推荐)
用${var#?}移除第一个字符,${var%?}移除最后一个字符,这种写法所有Bash版本都支持,同时加上tr -d '\n'清理多余换行:
#!/bin/bash # 提取第三列并清理换行符 MA=$(bt-device -l | cut -d " " -f 3 | tr -d '\n') # 移除第一个字符 MAC=${MA#?} # 移除最后一个字符 MAC=${MAC%?} # 给变量加引号避免特殊字符问题 bluetoothctl connect "$MAC"
方案2:用sed直接在提取时处理
如果想一步到位,可以用sed直接去掉首尾字符:
#!/bin/bash # 提取第三列后直接用sed移除首尾字符,再清理换行 MAC=$(bt-device -l | cut -d " " -f 3 | sed -e 's/^.//' -e 's/.$//' | tr -d '\n') bluetoothctl connect "$MAC"
验证方法
可以先单独执行提取命令,确认输出是否符合预期:
bt-device -l | cut -d " " -f 3 | tr -d '\n' | sed -e 's/^.//' -e 's/.$//'
如果输出是干净的98:9E:63:18:00:88,再整合到脚本里即可。
内容的提问来源于stack exchange,提问作者AzureRuby
相关产品推荐
相关产品推荐

