web-dev-qa-db-fra.com

Comment convertir une chaîne en tableau en script bash?

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.

2
Jes

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
6
steeldriver

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'
1
Arronical