J'essaie de convertir une chaîne en un tableau et de boucler ce tableau pour transmettre chaque valeur en tant que paramètre à une commande bash. Je reçois un mauvais message de substitution lorsque j'exécute les scripts.
text = 'xdc','cde','erd','ded','ded','kie';
OIFS=$IFS;
IFS=',';
ids=$($text);
for (i=0; i<${#ids[@]}; ++i);
do
echo "$i"
done
IFS=$OIFS
C’est le script que j’ai écrit, ainsi que la manière de passer la valeur d’index en tant que paramètre à une commande à l’intérieur de la boucle for.
Tout d’abord, vous devez supprimer le texte de l’attribution de la variable chaîne:
text="'xdc','cde','erd','ded','ded','kie';"
Ensuite, vous pouvez simplement utiliser le tableau de la commande bash read
:
IFS=, read -a ids <<< "${text%;}"
où la substitution ${text%;}
supprime le point-virgule de fin. Notez que, de cette manière, l’IFS n’est pas modifié en dehors de la commande read
. Il n’est donc pas nécessaire de l’enregistrer ou de le restaurer.
Votre syntaxe for-loop de style C est presque correcte, sauf que dans bash, la boucle nécessite des doubles parenthèses, par exemple.
for ((i=0; i<${#ids[@]}; ++i)); do printf '%s\n' "${ids[i]}"; done
Vous pouvez également effectuer une boucle sur les membres du tableau directement à l'aide d'une boucle for ... in
:
for i in "${ids[@]}"; do printf '%s\n' "$i"; done
Cela fera écho à tous les éléments de votre chaîne initiale, garantira qu'il n'y a pas d'espace à côté de =
dans text=
et utilisera des guillemets doubles autour de la chaîne. De plus, vous utilisez des ;
s inutiles dans votre code.
#!/bin/bash
text="'xdc','cde','erd','ded','ded','kie'"
IFS=',' read -ra ids <<< "$text"
for i in "${ids[@]}"
do
echo "$i"
done
Cela produira
'xdc'
'cde'
'erd'
'ded'
'ded'
'kie'