Как перебрать символы строки в сценарии оболочки POSIX? - PullRequest
0 голосов
/ 27 июня 2018

Оболочка, совместимая с POSIX, должна обеспечивать такие механизмы для перебора коллекций строк:

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

Но как мне перебрать каждый символ слова?

Ответы [ 3 ]

0 голосов
/ 27 июня 2018

Это немного сложновато, но я думаю, что это будет работать в любой оболочке, совместимой с posix. Я попробовал это в 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"}" необходимы, если строка содержит «*».

0 голосов
/ 27 июня 2018

Это работает в dash и busybox:

echo 'ab * cd' | grep -o .

Выход:

a
b

*

c
d
0 голосов
/ 27 июня 2018

Вы можете использовать команду 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
...