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.
Author by
Admin
Updated on December 28, 2020Comments
-
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 almost 11 years$hosttoHost$i becomes 1 instead of $hosttoHost1
-
Admin almost 11 yearsthank 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 almost 11 yearsEdited again: you can use an array, it's more readable and you don't have to compute names of other variables.