1

我创建了一个脚本来更新 iptables 中的一些 ipaddress。在此,我正在描述我面临的问题。

问题:

  1. 脚本中的两个变量之间没有进行比较
  2. 在脚本结束时,我需要执行一个命令,即;服务重启/停止等和命令的输出应该在执行脚本时可见。

1)这里比较两个变量字符串:

BASE=172.31.0.0
CMD=172.31.1.0

if [[ "$CMD" == "$BASE" ]]; then
   echo "ip are same"
else
   echo "not matched"
fi

但执行上述脚本时没有响应/输出。这里没有发生比较。请提出解决此问题的最佳解决方案。

2)执行脚本后我需要重新启动iptables:

BASE=172.31.0.0
CMD=172.31.1.0

if [[ "$CMD" == "$BASE" ]]; then
   echo "ip are same"
else
   echo "not matched"
fi

service iptables restart
iptables -nvL

脚本应该显示最后两行(命令)的输出。请建议我最好的解决方案以及如何以最佳方式做到这一点。

4

1 回答 1

1

这很奇怪。这应该可以工作,所以如果它不工作,你忘了提到一些重要的事情。

这个脚本是如何执行的?您是简单地键入 ./script 还是由某些服务(如 cron)执行?

以下是一些调试建议:

  1. 健全性检查:查看 bash 是否有效(也许您的登录 shell 不是 bash,所以您没有注意到)。在终端运行:

    /bin/bash -c 'echo hello world'
    
  2. 它打印你好世界,对吧?这个怎么样:

    /bin/bash -c 'BASE=172.31.0.0; CMD=172.31.1.0; if [[ "$CMD" == "$BASE" ]]; then echo "ip are same"; else echo "not matched"; fi'
    

    如果以上任何一项都不起作用,那么您的 bash 安装有问题。

  3. 不要使用 ./script.sh 执行脚本,而是像这样运行它:

    /bin/bash script.sh
    
  4. 没有什么?运行这个:

    file script.sh
    

    如果它以“带有 CRLF 行终止符”之类的内容结尾,那么 cdarke 就确定了:该文件是在 Windows 上使用不正确的工具创建的。在 Linux 上重新创建它或使用 dos2unix。但无论如何,我对此表示怀疑,因为使用 CRLF 结尾的文件我得到了这个打印:

    bash: ./script.sh: /bin/bash^M: bad interpreter: No such file or directory
    

    而不是什么都没有。

  5. 把这些放在文件的开头:

    set -x
    

    (在#!/bin/bash下方,如果有的话)。这确保将打印调试跟踪,在执行时显示每个命令。

  6. 如果仍然没有显示任何内容..把它放在你的脚本中(如果你把它放在set -x下面):

    touch /tmp/hi-this-is-strange
    

    然后在运行脚本后检查是否有/tmp/hi-this-is-strange文件。

于 2013-02-14T01:13:13.827 回答