BusyBox Shell中如何从末尾提取子串与HTTP状态码?
BusyBox /bin/sh提取末尾三位状态码的正确方法
BusyBox v1.25.1自带的/bin/sh是简化版POSIX shell,不支持Bash特有的负索引子串语法,所以你尝试的${teste: -2}、${teste:(-2)}会报bad substitution,而${response:-1:3}本身是错误用法(这是变量默认值语法,不是子串提取)。下面是两种可行的提取方法:
方法一:使用expr正则匹配
利用expr的正则匹配功能捕获最后三位字符:
status=$(expr "$response" : '.*\(...\)')
- 原理:
.*匹配任意长度的前缀,\(...\)捕获最后三位字符,expr会返回捕获到的内容。
方法二:使用cut结合变量长度计算
先通过${#response}获取变量的总长度,再计算起始位置截取末尾三位:
# 计算起始位置:总长度-2(因为cut的-c参数从1开始计数) start_pos=$((${#response} - 2)) status=$(echo "$response" | cut -c "$start_pos"-)
- 原理:
${#response}返回字符串的字符数,减去2后得到倒数第三位的位置,cut -c N-会从第N位开始截取到字符串末尾。
验证示例
假设response="good200",执行上述任意一种方法后,$status的值为200;若response="bad404",则$status为404。
内容的提问来源于stack exchange,提问作者markfree
相关产品推荐
相关产品推荐

