How can I get the variable value inside the EOF tags?

72,471

Remove the backslash before EOF:

#!/bin/bash

i=ok

# This prints "Bwah ok"
cat <<EOF
Bwah $i
EOF

# This prints "Bwah $i"
cat <<\EOF
Bwah $i
EOF

To get your last line display rightsubnet="10.109.0.20/32" (for i=1), you need something like this:

i=1
val1=beep
val2=bop

rightval="val$i"
cat <<EOF
This is a beep: ${!rightval}
EOF

That is, you compute the name of the variable you want, put that in another variable, and use the ${!var} syntax.

But for that kind of thing you should rather use an array:

i=0
vals=(beep bop)

cat <<EOF
This is a beep: ${vals[$i]}
EOF

Note however that the indexes start at 0.

Share:
72,471
Admin
Author by

Admin

Updated on December 28, 2020

Comments

  • Admin
    Admin over 3 years

    I have this following script, but I need to get $i variable value working inside that each block starting with EOF and ending with EOF.

    It is not reading the variable value but putting $i.

    /var/tmp/vpn.sh I have:

    #!/bin/bash
    amazonEth0="10.0.0.18"
    amazonWan0="4.9.2.9"
    vpnServer="4.8.8.6"
    hosttoHost1="10.109.0.20/32"
    hosttoHost2="10.109.0.21/32"
    hosttoHost3="10.109.58.6/32"
    hosttoHost4="10.109.59.3/32"
    
    for i in 1 2 3 4
    do
    cat > /tmp/test$i.conf << \EOF
    #Step 3
    conn test"$i"
        #auto=start
        type=tunnel
        authby=secret
        pfs=no
        aggrmode=no
        ikelifetime=28800s
        lifetime=3600s
        ike=aes128-md5;modp1024!
        phase2alg=aes128-md5;modp1024
        forceencaps=yes
        left=$amazonLan0
        leftid=$amazonWan0
        leftsourceip=$amazonWan0
        right=$vpnServer
        rightsubnet=$hosttoHost$i
    EOF
    done
    
    ### Run me
    cat > /var/tmp/vpn.sh << \EOF
    service ipsec restart
    
    ######## Apply for loop here, instead of many many lines ###########
    # for i in 1 2 3 4
    # do
    #   ipsec auto --add test$i
    # done
    ipsec auto --add test1
    ipsec auto --add test2
    ipsec auto --add test3
    ipsec auto --add test4
    
    ######## Apply for loop here, instead of many many lines ###########
    # for i in 1 2 3 4
    # do
    #   ipsec auto --up test$i
    # done
    ipsec auto --up test1
    ipsec auto --up test2
    ipsec auto --up test3
    ipsec auto --up test4
    
    ipsec auto --status
    ip xfrm policy
    ip route show
    
    ######## Apply for loop here, instead of many many lines ###########
    # for i in 1 2 3 4
    # do
    #   ping -c 1 $hosttoHost$i
    # done
    ping -c 1 10.109.0.20; 
    ping -c 1 10.109.0.21;
    ping -c 1 10.109.58.6; 
    ping -c 1 10.109.59.3; 
    
    EOF
    chmod +x /var/tmp/vpn.sh
    
    # Cake - eat now - optional 
    /var/tmp/vpn.sh > save output | mail -s ipsec date time &
    
  • Admin
    Admin almost 11 years
    $hosttoHost$i becomes 1 instead of $hosttoHost1
  • Admin
    Admin almost 11 years
    thank you. can i not do it inside cat <<EOF here....here.... EOF then its debug friendly in large script (basically my script is more larger)
  • Pikrass
    Pikrass almost 11 years
    Edited again: you can use an array, it's more readable and you don't have to compute names of other variables.