回答
使用蛮力,无知和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 [*]
$
您可以用改进:,不超调数组的结束,而是显得更加简洁高深莫测 - Perl的吃你的心脏了!
我希望有更好的方法。
(显然,这取决于你到底如何设置consC
,你可能会在输出中获得略有不同的数字。)
注:这是在Mac OS X 10.8.4测试,但我有一个自制bash
4.2可用(尽管我大多数时候使用bash
3.2.48 - 因此头痛)。如果你不能使用bash
,只提供sh
,您需要与"$(expr "$consC" : '^.\{'"$i"'\}\(.\)')"
更换"${consC:$i:1}"
:
$ 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]
你能澄清你的问题?表达式'$ {consC:$ i:1}'出现在代码中;它是从开始位置'$ i'开始的长度为1的子字符串,因此它是字符串中的第i个字符。但是循环是由'$(seq 0 $ {#consC})'的输出控制的,它是数字0..56或其附近。 –
第一个工作正常! – user2662478
太棒了;第一种解决方案比使用'expr'更好。这可能是因为我将'bash' 3.x作为'sh'仍然运行 - 而不是'bash' - 并且说明了我的头痛。避免'expr'是生活中的一个很好的总体目标; OTOH,它是一个强大的(如果相当笨拙的)工具。 –
- 1. 得到猛砸
- 2. 猛砸LS和指挥管
- 3. 在猛砸
- 4. 在猛砸
- 5. 在猛砸
- 6. 猛砸与管
- 7. 猛砸参数替换
- 8. 在猛砸文件
- 9. 猛砸在屏幕
- 10. 猛砸在名称
- 11. 懒评价猛砸
- 12. 猛砸功能
- 13. 猛砸为NULL
- 14. 猛砸描述
- 15. 猛砸串
- 16. 格局猛砸
- 17. 猛砸从线
- 18. 从猛砸
- 19. 从猛砸
- 20. 猛砸忽略$
- 21. 遍历猛砸
- 22. 读线,猛砸
- 23. 从Ubuntu的猛砸
- 24. 猛砸获取进程ID在子shell
- 25. 猛砸,参数列表段
- 26. 猛砸如何参数
- 27. 环路与在猛砸
- 28. 运行猛砸在Windows 7
- 29. 猛砸本地化
- 30. 猛砸对目录
http://mywiki.wooledge.org/XyProblem –