如何编写Bash脚本实现固定长度循环字符串截取功能
Bash 固定偏移环绕截取指定长度字符串实现
最简实现思路
不需要拆分两种场景写条件判断,用一个简单的字符串拼接技巧就能覆盖所有需求:
- 先拿到原字符串长度
n - 把原字符串拼接自身,得到长度为
2n的新字符串——结合题目给定前提M,N < n,所有可能的环绕截取结果都能在这个两倍长度的串里找到,不需要额外补更多内容 - 直接用Bash原生子串语法,从两倍串的
M索引位置开始截N个字符,得到的结果就是目标内容:没超出原串长度时就是普通截断,超出时自动带上原串开头的补全内容,不需要额外计算补位长度。
可直接运行的脚本
#!/bin/bash # 入参校验 if [ $# -lt 2 ]; then echo "调用方式: $0 <输入字符串> <目标长度N> [偏移量M]" exit 1 fi str="$1" N="$2" M="${3:-0}" # 偏移量不传时默认取0 # 拼接双份原串后直接截取 double_str="${str}${str}" res="${double_str:M:N}" echo "$res"
脚本保存后执行chmod +x script.sh赋予执行权限即可使用。
示例验证
对应列出的所有测试用例,运行结果完全符合预期:
- 执行
./script.sh "Hello world!" 5 3,输出lo wo - 执行
./script.sh "Hello world!" 9 0,输出Hello wor - 执行
./script.sh "Hello world!" 5 10,输出d!Hel - 执行
./script.sh "Hello world!" 11 6,输出world!Hello
补充说明
Bash原生子串截取语法${var:start:length}本身不会做环绕处理,如果截取长度超过原串长度,只会截到原串末尾就停止。提前拼接双份原串的做法,本质是把所有可能需要补位的开头内容提前放到了截取范围内,省去了写分支判断、计算补位长度的步骤,代码更短也更不容易出逻辑错误。
内容的提问来源于stack exchange,提问作者Oh Fiveight
相关产品推荐
相关产品推荐

