Supposons que j'ai une variable shell Unix comme ci-dessous
variable=abc,def,ghij
Je veux extraire toutes les valeurs ( abc
, def
et ghij
) en utilisant une boucle for et passer chaque valeur dans une procédure.
Le script doit permettre d'extraire un nombre arbitraire de valeurs séparées par des virgules $variable
.
Réponses:
Vous pouvez utiliser le script suivant pour parcourir dynamiquement votre variable, quel que soit le nombre de champs qu'elle contient, à condition qu'elle ne soit séparée que par des virgules.
Au lieu de l'
echo "$i"
appel ci-dessus, entre lado
etdone
à l'intérieur de la boucle for, vous pouvez appeler votre procédureproc "$i"
.Mise à jour : l'extrait de code ci-dessus fonctionne si la valeur de la variable ne contient pas d'espaces. Si vous avez une telle exigence, veuillez utiliser l'une des solutions qui peuvent changer
IFS
, puis analyser votre variable.J'espère que cela t'aides.
la source
$variable
contient des espaces, par exemplevariable=a b,c,d
=> imprime 4 lignes (a | b | c | d) au lieu de 3 (ab | c | d)"value
**. pourriez-vous s'il vous plaît mettre à jour s'il y a une regex pour supprimer cela ..Ne pas jouer avec IFS
Ne pas appeler de commande externe
Utilisation de la manipulation de chaînes bash http://www.tldp.org/LDP/abs/html/string-manipulation.html
la source
IFS
!$i
contient des espaces, elle sera divisée (et cela pourrait être la raison pour laquelle elle est passée comme séparée par des virgules plutôt que par des espaces)for i in ${variable//,/$IFS} do; echo "$i"; done
Si vous définissez un séparateur de champ différent, vous pouvez directement utiliser une
for
boucle:Vous pouvez également stocker les valeurs dans un tableau, puis le parcourir comme indiqué dans Comment diviser une chaîne sur un délimiteur dans Bash? :
Tester
Vous pouvez trouver une approche plus large dans cette solution pour parcourir une liste séparée par des virgules et exécuter une commande pour chaque entrée .
Exemples sur la deuxième approche:
la source
while
pour lire dans un tableau et un autre pour parcourir les résultats.IFS
revenir à ce que c'était avant?Je préfère utiliser tr au lieu de sed, car sed a des problèmes avec des caractères spéciaux comme \ r \ n dans certains cas.
une autre solution consiste à régler IFS sur un certain séparateur
la source
Voici une solution alternative basée sur tr qui n'utilise pas d'écho, exprimé sous la forme d'une ligne unique.
C'est plus net sans écho, mais ce n'est que ma préférence personnelle.
la source
Essaye celui-là.
la source
http://stackoverflow.com/questions/8629330/unix-count-of-columns-in-file
. Après cela, faites une boucle for en boucle while. Vous pouvez obtenir celui-là.Autre solution n'utilisant pas IFS et préservant toujours les espaces:
la source
Voici ma solution pure bash qui ne change pas IFS et peut prendre un délimiteur d'expression régulière personnalisé.
la source