Loop over tuples in bash?
Solution 1:
$ for i in c,3 e,5; do IFS=","; set -- $i; echo $1 and $2; done
c and 3
e and 5
About this use of set
(from man builtins
):
Any arguments remaining after option processing are treated as values for the positional parameters and are assigned, in order, to $1, $2, ... $n
The IFS=","
sets the field separator so every $i
gets segmented into $1
and $2
correctly.
Via this blog.
Edit: more correct version, as suggested by @SLACEDIAMOND:
$ OLDIFS=$IFS; IFS=','; for i in c,3 e,5; do set -- $i; echo $1 and $2; done; IFS=$OLDIFS
c and 3
e and 5
Solution 2:
This bash style guide illustrates how read
can be used to split strings at a delimiter and assign them to individual variables. So using that technique you can parse the string and assign the variables with a one liner like the one in the loop below:
for i in c,3 e,5; do
IFS=',' read item1 item2 <<< "${i}"
echo "${item1}" and "${item2}"
done
Solution 3:
Based on the answer given by @eduardo-ivanec without setting/resetting the IFS
, one could simply do:
for i in "c 3" "e 5"
do
set -- $i # convert the "tuple" into the param args $1 $2...
echo $1 and $2
done
The output:
c and 3
e and 5
Solution 4:
Use associative array (also known as dictionary / hashMap):
animals=(dog cat mouse)
declare -A sound=(
[dog]=barks
[cat]=purrs
[mouse]=cheeps
)
declare -A size=(
[dog]=big
[cat]=medium
[mouse]=small
)
for animal in "${animals[@]}"; do
echo "$animal ${sound[$animal]} and it is ${size[$animal]}"
done