2013-04-20 87 views
0

我试图用猫EOF编写一个bash脚本来自动安装一个cron脚本,这部分是打破脚本,我不知道我要去哪里错了。出于某种原因,该脚本呼应之前运行这些命令/etc/no-ip.shBash脚本 - 猫EOF打破

echo "#!/bin/sh" >> /etc/no-ip.sh 
echo "HOSTNAME=hostname" >> /etc/no-ip.sh 
echo "LOGFILE=no-ip-log" >> /etc/no-ip.sh 
echo " " >> /etc/no-ip.sh 
echo "Current_IP=$(host $HOSTNAME | cut -f4 -d' ')" >> /etc/no-ip.sh 
echo " " >> /etc/no-ip.sh 
echo "if [ ! -s $LOGFILE ] ; then" >> /etc/no-ip.sh 
echo "echo "sshd : $Current_IP : allow" >> /etc/hosts.allow" >> /etc/no-ip.sh 
echo "echo $Current_IP > $LOGFILE" >> /etc/no-ip.sh 
echo "else" >> /etc/no-ip.sh 
echo " " >> /etc/no-ip.sh 
echo "Old_IP=`head -n 1 /etc/no-ip-log`" >> /etc/no-ip.sh 
echo " " >> /etc/no-ip.sh 
echo "if [ "$Current_IP" = "$Old_IP" ] ; then" >> /etc/no-ip.sh 
echo "echo IP address has not changed" >> /etc/no-ip.sh 
echo "else" >> /etc/no-ip.sh 
echo "sed -i 's/'$Old_IP'/'$Current_IP'/' /etc/hosts.allow" >> /etc/no-ip.sh 
echo "echo $Current_IP > $LOGFILE" >> /etc/no-ip.sh 
echo "echo iptables have been updated" >> /etc/no-ip.sh 
echo "fi" >> /etc/no-ip.sh 
echo "fi" >> /etc/no-ip.sh 
echo "EOF" >> /etc/no-ip.sh 

回答

2

双引号仍然得到评估,如内部的某些东西:

echo "Current_IP=$(host $HOSTNAME | cut -f4 -d' ')" >> /etc/no-ip.sh 

在这里, $(...)结构被评估。所以你想在整个事情中使用单引号:

echo 'Current_IP=$(host $HOSTNAME | cut -f4 -d" ")' >> /etc/no-ip.sh 

和其他行相似。


也就是说,heredoc可能是写这个的更好方法。您需要引用您的分隔符字符串以便正文解释正文:

cat <<'EOF' > /etc/no-ip.sh 
... 
EOF 
+0

谢谢!!!!!!我一直试图使用猫,并没有意识到'EOF'是一种选择。为什么引用分隔符字符串会强制字面解释正文? – 2013-04-20 20:47:15

+0

这就是bash编码的方式。请参阅我链接到的页面中的示例19-7。 – Thomas 2013-04-21 08:12:42