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}
我一直在尝试获取一个字符串以在同一行上单独输出每个字符(在 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}