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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:03:28