2

Using kernel 2.6.x

GNU bash, version 4.3.42(1)-release (arm-openwrt-linux-gnu)

In a bash script, how would you write a for loop that produces the following result with the variables below ?

command option option abc option 10
command option option def option 20

VAR1="abc def"

VAR2="10 20"

I can iterate $VAR1, but I don't know how to iterate $VAR2.

for i in $VAR1; do
command option option "$VAR1" option "$VAR2"
done

Should the command line be split into two strings, iterated separately and then concatenated ?

How about using a count variable with an array ? For example ...

count=1
echo ${VAR1["$count"]}

Could a count variable with a while loop work ?

4
  • 2
    Are you trying to get all permutations of the combinations of the two variables?
    – DopeGhoti
    Aug 16, 2017 at 17:43
  • Does this answer on SO do what you want?
    – Paul H.
    Aug 16, 2017 at 17:51
  • Updated the result example.
    – uihdff
    Aug 16, 2017 at 17:55
  • @DopeGhoti - The relationship between the variables would be 1:1. For example, the first values of each variable would be used - abc and 10.
    – uihdff
    Aug 16, 2017 at 18:03

2 Answers 2

4

How about this:

arr1=(abc def)
arr2=(10 20)

And then:

for (( i=0; i<${#arr1[@]}; i++ )); do echo "${arr1[i]} ${arr2[i]}"; done
abc 10
def 20

In your case, the echo statement will then look like:

for (( i=0; i<${#arr1[@]}; i++ )); do 
    echo "command option option ${arr1[i]} option ${arr2[i]}"
done
command option option abc option 10
command option option def option 20

Look here for examples on a C style for loop in bash.

6
  • I'm getting an error on the first variable line - syntax error: unexpected "(". Quoting the variable values gets rid of that error, but creates another error - syntax error: bad for loop variable.
    – uihdff
    Aug 16, 2017 at 18:54
  • Strange. Works fine on Debian Stretch with: GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu) Aug 16, 2017 at 19:06
  • 2
    @uihdff, that's an error message typically reported by busybox sh (based on ash, that doesn't have array support), not bash. You're not having this code interpreted by bash. Aug 16, 2017 at 19:10
  • #!/bin/sh is at the top of the script and the commands followed on the next lines. Running "bash --version" reports "GNU bash, version 4.3.42(1)-release (arm-openwrt-linux-gnu)". Why is ash being used ?
    – uihdff
    Aug 16, 2017 at 20:26
  • Had to change the shebang to "#!/opt/bin/bash". It's working now. Tack så mycket !
    – uihdff
    Aug 16, 2017 at 20:59
3

It's easier with zsh:

$ a=(a b c) b=(1 2 3)
$ for i j (${a:^b}) echo "i: $i, j: $j"
i: a, j: 1
i: b, j: 2
i: c, j: 3

${a:^b} is the array-zipping operator (expands to a, 1, b, 2, c, 3 above).

If you wanted to loop over words resulting of the split+glob operator applied to $VAR1 and $VAR2 in a POSIX-like shell (like the busybox sh you seem to be using according to the comments to @maulinglawns's answer), you could use the positional parameters.

VAR1='a b c'
VAR2='1 2 3'
set -- $VAR1
for j in $VAR2; do
  echo "i: $1, j: $j"
  shift
done
1
  • Did the for line need ";do" at the end ? Thanks for the help.
    – uihdff
    Aug 16, 2017 at 21:01

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .