bash 如何从字符串中减去字符

bash how subtract characters from string

我一直在尝试获取一个字符串以在同一行上单独输出每个字符(在 bash 中具有奇特的渐变效果),尽管下标部分的某些内容不太正确:

str="foobar"
n=0 ; for i in {16..21} {21..16} ; do
    echo -ne "3[48;5;${i}m ${str:str[i-n]:n++} 3[0m" ; 
    sleep 1;
done

它输出:

f  fo  foo  foob  fooba  foobar  foobar  foobar  foobar  foobar  foobar 

但我希望得到:

f  o  o  b  a  r

所以可能是我的方法不对,或者我遗漏了一些明显的东西?

您需要始终获得长度为 1 且索引递增的子字符串 n:

n=0
for i in {16..21} {21..16}; do
    echo -ne "3[48;5;${i}m ${str:n++:1} 3[0m"
    sleep .5
done

在表达式 ${str:str[i-n]:n++} 中, str[i-n] 的数值实际上是 0。 循环步骤中的部分计算值如下所示:

  • ${str:0:1}
  • ${str:0:2}
  • ${str:0:3}
  • ${str:0:4}
  • ...等等

${var:start:count}里面第二个:后面的值是从开始位置算起的字符数。由于起始位置永远不会改变,因此您会得到 f、fo、foo、foob 等等。

如果你想得到f,o,o,b,a,r,那么你需要将起始位置向前,并保持计数为1,使用这个表达式:

${str:n++:1}