OS X 上的 Bash 4.3 子字符串负长度

OS X 上的 Bash 4.3 子字符串负长度

Bash 4.2 增加了对负子串长度的支持:

http://tldp.org/LDP/abs/html/abs-guide.html#SUBSTREXTR01

例子 37-12. 字符串提取结构中的负参数

当“长度”参数为负数时,它作为偏移末端参数。

例如,在 Ubuntu 上测试时,以下内容输出“World”:

STR="Hello World!"
echo ${STR:6:-1}

但是在 OS X(GNU bash,版本 4.3.42(1)-release(x86_64-apple-darwin14.5.0))中,这种用法会产生以下错误:

-1: substring expression < 0

这是 OS X 独有的吗,还是在后来的 bash 更新中又被禁用了?有没有办法为 OS X 启用此功能?

答案1

虽然 flabdablet 的解决方案仅适用于固定长度的字符串,但您可以将其用作动态大小字符串的替代品:

echo ${STR:6:$((${#STR} - 6 - 1))}

详细地:

  • ${#STR}返回字符串的长度。
  • $((a - b - c))做数学减法
  • ${STR:start:len}返回一个子字符串。

因此,子字符串表达式的第二个参数等于字符串的长度减去起始偏移量减去在较新的 bash 语法中指定为负值的值。

答案2

如果 STR 保证包含至少 7 个字符,则 ${STR:6:${#STR}-7} 应可作为 ${STR:6:-1} 的有效替代品。如果可以更短,这也会导致 OS X bash 抱怨负长度,或者在支持将负长度作为从右偏移量的 bash 版本上出现严重错误。

答案3

可以使用长度作为输入来计算,从而动态地在末端进行切割。

${STR:0:${#STR}-2}

-2 是负数。

答案4

从 Google 搜索这里

他们说${STR:6:$#-1}应该很好用

就我而言,出现了类似的错误${VERSION::-2},只需添加 0 后它就可以开始工作了,如下所示:${VERSION:0:-2}

相关内容