I’m trying to loop through multiple comma separated strings with same number of commas in the string.
I’ve tried the below snippet but it doesn’t return anything.
#!/bin/bash
ip1=“Ok1,ok2,ok3”
ip2=“ty1,ty2,ty3”
for i in ${ip[@]//,/}
do
echo $i
done
Could someone please suggest how I can change this.
CodePudding user response:
Replace the comma-separated string with an array as soon as feasible. If it's a hard-coded string, that's trivial:
ip1=(Ok1 ok2 ok3)
If it's from an external source (say, a command-line argument or read from a file), use read
:
ip1s="Ok1,ok2,ok3"
IFS=, read -a ip1 <<< "$ips1"
Once you have an array, you can use array syntax for iteration:
for i in "${ip1[@]}"; do
echo "$i"
done
If you have multiple arrays you want to iterate in lockstep, you can iterate over the keys of the arrays:
for i in "${!ip1[@]}"; do
echo "${ip1[i]}"
echo "${ip2[i]}"
done
(This ignores the possibility of sparse arrays, but you have to work to get those. In practice, arrays with n
elements usually have keys 0, 1, ... n
-1.)
CodePudding user response:
Fixes:
- Change
ip
toip1
orip2
- Change the smart quotes to regular quotes:
“
→"
- Replace the commas with spaces by adding a space after the final
/
ip1="Ok1,ok2,ok3"
ip2="ty1,ty2,ty3"
for i in ${ip1//,/ }
do
echo "$i"
done
It would be better to use arrays, then the items would be naturally separated and you wouldn't have to do any string manipulation.
ip1=(Ok1 ok2 ok3)
ip2=(ty1 ty2 ty3)
for i in "${ip1[@]}"
do
echo "$i"
done