"$consC"
在带有空格和's的双引号字符串中*
,如下所示:
* **** *****
如何获取每个*
's 的索引?
使用蛮力、无知和bash
(4.x 或 3.x——但如果它被调用为/bin/sh
或sh
——我的头在sh
撞到砖墙上后会疼),你可以尝试:
$ for i in $(seq 0 ${#consC}); do [ "${consC:$i:1}" = "*" ] && echo "$i [${consC:$i:1}]"; done
44 [*]
46 [*]
47 [*]
48 [*]
49 [*]
51 [*]
52 [*]
53 [*]
54 [*]
55 [*]
$
你可以用 : 来改进它$(seq 0 $((${#consC}-1)) )
,它不会超出数组的末端,但更简洁,更难以理解——Perl 吃掉你的心!
我希望有更好的方法。
(显然,根据您设置的具体方式consC
,您可能会在输出中得到略有不同的数字。)
注意:这是在 Mac OS X 10.8.4 上测试的,但我有一个自制的bash
4.2 可用(尽管我bash
大部分时间都使用 3.2.48 - 因此很头疼)。如果您不能使用bash
并且只有sh
,则需要替换"${consC:$i:1}"
为"$(expr "$consC" : '^.\{'"$i"'\}\(.\)')"
:
$ for i in $(seq 0 ${#consC}); do [ "$(expr "$consC" : '^.\{'"$i"'\}\(.\)')" = '*' ] && echo $i; done
44
46
47
48
49
51
52
53
54
55
$
或者,使用[[
运算符和两个更少的双引号:
$ for i in $(seq 0 ${#consC}); do [[ $(expr "$consC" : '^.\{'"$i"'\}\(.\)') = '*' ]] && echo $i; done
44
46
47
48
49
51
52
53
54
55
$
[...由于各种原因可以追溯到史前时期,/bin/sh
即使在我认为我已经将它解开运行之后,我的外壳也被弄乱了/bin/bash
......我现在已经解决了这个问题!毕竟我正在运行/bin/bash
......并且原始版本没有expr
在bash
3.2.48 上正常工作。]