12 votes

Comment itérer sur les caractères d'une chaîne de caractères dans un shell POSIX script ?

Un shell conforme à POSIX doit fournir des mécanismes de ce type pour itérer sur des collections de chaînes de caractères :

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

Mais comment itérer sur chaque caractère d'un mot ?

13voto

Gordon Davisson Points 22534

C'est un peu compliqué, mais je pense que cela fonctionnera dans n'importe quel shell compatible avec posix. Je l'ai essayé dans dash mais je n'ai pas de busybox à portée de main pour tester.

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

Sortie :

a
b

*

c
d

Notez que les guillemets entourant le côté droit des affectations ne sont pas nécessaires ; je préfère simplement utiliser des guillemets autour de toutes les expansions plutôt que d'essayer de savoir où il est prudent de les laisser. D'autre part, les guillemets doubles de [ -n "$tmp" ] sont absolument nécessaires, et les doubles guillemets intérieurs de first="${tmp%"$rest"}" sont nécessaires si la chaîne contient "*".

2voto

agc Points 4529

Cela fonctionne en dash y busybox :

echo 'ab * cd' | grep -o .

Sortie :

a
b

*

c
d

0voto

Luis Lavaire Points 158

Vous pouvez utiliser le fold pour ajouter une nouvelle ligne après chaque caractère et stocker le résultat dans une variable. Vous pouvez ensuite itérer sur ses éléments.

word="some_word"

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

Il s'imprime :

s
o
m
e
_
w
o
r
d

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X