在POSIX sh环境下,能否不借助外部工具遍历字符串?
无需外部命令的POSIX sh字符串字符遍历方法
当然可以!在POSIX兼容的shell中,完全可以只依靠内置特性实现字符串的逐字符遍历,不用调用cut这类外部命令。这里给你两种实用的纯shell实现方式:
方法一:利用参数展开(推荐,简洁直观)
POSIX sh支持${string:offset:length}形式的参数展开,可以直接从指定位置截取指定长度的字符。我们可以借助这个特性结合循环来遍历:
#!/bin/sh lizards='geckos,anoles' string_length="${#lizards}" i=0 # 索引从0开始,直到小于字符串总长度 while [ "$i" -lt "$string_length" ]; do # 从位置i截取1个字符 char="${lizards:i:1}" echo "$char" # 索引自增 i="$(( i + 1 ))" done
这个实现完全依赖shell内置的参数展开和算术运算,没有调用任何外部命令,执行效率比调用cut的版本更高。
方法二:利用字符串截取与匹配(兼容更老的shell环境)
如果遇到某些对参数展开支持有限的老版本shell,还可以用字符串的前缀/后缀截取特性来实现:
#!/bin/sh lizards='geckos,anoles' # 当字符串不为空时持续循环 while [ -n "$lizards" ]; do # 提取第一个字符:原字符串减去"去掉第一个字符后的字符串" char="${lizards%"${lizards#?}"}" echo "$char" # 去掉字符串的第一个字符,进入下一轮循环 lizards="${lizards#?}" done
这里的${lizards#?}会去掉字符串的第一个字符(?匹配任意单个字符),${lizards%"${lizards#?}"}则是保留原字符串中除了“去掉第一个字符后的部分”之外的内容——也就是第一个字符。每次循环后我们都会截断字符串的首字符,直到字符串为空。
这两种方法都能输出和你原来代码完全一致的结果,而且全程不需要调用外部工具,更符合纯POSIX shell的实现规范。
内容的提问来源于stack exchange,提问作者Harold Fischer
相关产品推荐
相关产品推荐

