BASH – 如何获得EOF标签内的variables值?

我有这个脚本,但我需要得到$variables值工作在每个块以EOF开始,EOF结束。

它不读取variables值,但把$我

/var/tmp/vpn.sh我有:

#!/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 & 

Solutions Collecting From Web of "BASH – 如何获得EOF标签内的variables值?"

EOF之前删除反斜杠:

 #!/bin/bash i=ok # This prints "Bwah ok" cat <<EOF Bwah $i EOF # This prints "Bwah $i" cat <<\EOF Bwah $i EOF 

为了让你的最后一行显示: rightsubnet="10.109.0.20/32" (对于i = 1),你需要这样的东西:

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

也就是说,你计算你想要的变量的名字,把它放在另一个变量中,并使用${!var}语法。

但是对于这种事情,你应该使用一个数组:

 i=0 vals=(beep bop) cat <<EOF This is a beep: ${vals[$i]} EOF 

但请注意,索引从0开始。