如何遍历POSIX Shell脚本中字符串的字符?

时间:2018-06-26 23:05:06

标签: shell sh posix dash-shell

符合POSIX的外壳程序应提供类似的机制来迭代字符串的集合:

for x in $(seq 1 5); do
    echo $x
done

但是,我如何遍历单词的每个字符?

3 个答案:

答案 0 :(得分:6)

这有点circuit回,但是我认为这可以在任何posix兼容的shell中使用。我已经在dash中尝试过了,但是我没有方便进行测试的busybox。

var='ab * cd'

tmp="$var"    # The loop will consume the variable, so make a temp copy first
while [ -n "$tmp" ]; do
    rest="${tmp#?}"    # All but the first character of the string
    first="${tmp%"$rest"}"    # Remove $rest, and you're left with the first character
    echo "$first"
    tmp="$rest"
done

输出:

a
b

*

c
d

请注意,不需要在作业右侧加上双引号;我只喜欢在所有扩展中使用双引号,而不是试图跟踪将其保留在哪里是安全的。另一方面,绝对必须使用[ -n "$tmp" ]中的双引号,如果字符串包含“ *”,则需要使用first="${tmp%"$rest"}"中的内部双引号。

答案 1 :(得分:0)

您可以使用fold命令在每个字符后添加换行符并将结果存储在变量中。然后,您可以遍历其元素。

word="some_word"

word=$(echo "$word" | fold -w 1)
for x in "$word"; do
    echo $x
done

它将打印:

s
o
m
e
_
w
o
r
d

答案 2 :(得分:0)

这适用于module: { rules: [ { parser: { amd: false } } ] } dash

busybox

输出:

echo 'ab * cd' | grep -o .