shell脚本比较两个变量

时间:2013-02-13 12:34:03

标签: bash shell sh

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

的问题:

  1. 脚本中两个变量之间没有发生比较
  2. 在脚本结束时我需要执行命令ie;服务重启/停止等,并且在执行脚本时应该可以看到命令的输出。
  3. 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
    

    脚本应显示最后两行(命令)的输出。请建议我最好的解决方案以及如何以最佳方式执行此操作。

1 个答案:

答案 0 :(得分: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. 如果仍然没有显示任何内容..将其放在您的脚本中(如果您将其放在设置-x 下方):

    touch /tmp/hi-this-is-strange
    

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