0

cat EOF を使用して bash スクリプトを作成し、cron スクリプトを自動的にインストールしようとしていますが、この部分がスクリプトを壊しており、どこが間違っているのかわかりません。何らかの理由で、スクリプトはこれらのコマンドを /etc/no-ip.sh にエコーする前に実行しています。

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
4

1 に答える 1

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

他の行についても同様です。


とはいえ、ヒアドキュメントはおそらくこれを書くためのより良い方法です。本文を文字どおりに解釈するには、区切り文字列を引用符で囲む必要があります。

cat <<'EOF' > /etc/no-ip.sh
...
EOF
于 2013-04-20T20:15:28.620 に答える