130 votes

Boucler sur des tuples en bash ?

Est-il possible de boucler sur des tuples en bash ?

À titre d'exemple, ce serait formidable si les éléments suivants fonctionnaient :

for (i,j) in ((c,3), (e,5)); do echo "$i and $j"; done

Existe-t-il une solution de contournement qui me permette de boucler sur les tuples ?

7 votes

Je viens d'un milieu python et cette question est très utile !

5 votes

En regardant ceci quatre ans plus tard, je me demande s'il n'y a toujours pas de meilleure façon de faire. omg.

0 votes

Presque 8 ans plus tard, je me suis également demandé s'il n'y avait toujours pas de meilleure façon de procéder. Mais cette réponse de 2018 me semble plutôt bonne : stackoverflow.com/a/52228219/463994

6voto

kev Points 41855
$ echo 'c,3;e,5;' | while IFS=',' read -d';' i j; do echo "$i and $j"; done
c and 3
e and 5

6voto

todd_dsm Points 662

Mais que faire si le tuple est plus grand que le k/v qu'un tableau associatif peut contenir ? Et si c'était 3 ou 4 éléments ? On pourrait développer ce concept :

###---------------------------------------------------
### VARIABLES
###---------------------------------------------------
myVars=(
    'ya1,ya2,ya3,ya4'
    'ye1,ye2,ye3,ye4'
    'yo1,yo2,yo3,yo4'
    )

###---------------------------------------------------
### MAIN PROGRAM
###---------------------------------------------------
### Echo all elements in the array
###---
printf '\n\n%s\n' "Print all elements in the array..."
for dataRow in "${myVars[@]}"; do
    while IFS=',' read -r var1 var2 var3 var4; do
        printf '%s\n' "$var1 - $var2 - $var3 - $var4"
    done <<< "$dataRow"
done

Alors la sortie ressemblerait à quelque chose comme :

$ ./assoc-array-tinkering.sh 

Print all elements in the array...
ya1 - ya2 - ya3 - ya4
ye1 - ye2 - ye3 - ye4
yo1 - yo2 - yo3 - yo4

Et le nombre d'éléments est désormais sans limite. Je ne cherche pas à obtenir des votes ; je pense simplement à voix haute. REF1 , REF2

4voto

Ole Tange Points 4907

Utilisation de GNU Parallel :

parallel echo {1} and {2} ::: c e :::+ 3 5

Ou :

parallel -N2 echo {1} and {2} ::: c 3 e 5

Ou :

parallel --colsep , echo {1} and {2} ::: c,3 e,5

2voto

prodriguez903 Points 101
do echo $key $value
done < file_discriptor

par exemple :

$ while read key value; do echo $key $value ;done <<EOF
> c 3
> e 5
> EOF
c 3
e 5

$ echo -e 'c 3\ne 5' > file

$ while read key value; do echo $key $value ;done <file
c 3
e 5

$ echo -e 'c,3\ne,5' > file

$ while IFS=, read key value; do echo $key $value ;done <file
c 3
e 5

2voto

anubhava Points 172509

Utilisation de printf dans un processus de substitution :

while read -r k v; do
    echo "Key $k has value: $v"
done < <(printf '%s\n' 'key1 val1' 'key2 val2' 'key3 val3')

Key key1 has value: val1
Key key2 has value: val2
Key key3 has value: val3

ci-dessus exige bash . Si bash n'est pas utilisé, il faut utiliser un simple pipeline :

printf '%s\n' 'key1 val1' 'key2 val2' 'key3 val3' |
while read -r k v; do echo "Key $k has value: $v"; done

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