【问题标题】:How do I check a bash script without running the script? [duplicate]如何在不运行脚本的情况下检查 bash 脚本? [复制]
【发布时间】:2013-08-12 08:40:55
【问题描述】:

如何检查 bash 脚本中的错误(可能还有警告)?

我想在将 bash 脚本检入 git 存储库之前对其进行预检。

我知道我可以使用bash -n script.sh 进行第一次简单的检查,但这找不到例如重写只读字符串之类的东西。

readonly unique_id = "42"
unique_id = "21"

bash -n script.sh 可以,但执行时当然会失败。

编辑: 以下脚本

#!/bin/bash
# check.sh
readonly unique_id="42"
unique_id="21"

如果您执行bash -n check.sh; echo $?,请提供0,但执行本身会导致错误消息./check.sh: line 4: unique_id: readonly variable

这两种行为都是正确的,因为这不是语法错误,但它仍然会中断执行(即使在单元测试中),我想问是否有另一种预检查方式来过滤掉此类错误。

Unittest 只会发现预期的逻辑故障,因此这不是替代方案。

【问题讨论】:

  • 上面贴的两行是错误的。您需要删除 = 周围的空格。
  • 是的,你是对的;我删除了空白并添加了一个 shebang 来获得一个真实世界的例子。谢谢

标签: bash


【解决方案1】:

我假设您考虑只运行该脚本来检查错误?然后,如果您不向stdout 发送一些“错误”消息,您还可以检查 bash 中的最后退出状态代码:$?。 (http://blog.yimingliu.com/2009/01/01/check-last-exit-status-code-in-bash-shell/)

【讨论】:

    【解决方案2】:

    另一种方法是将所有代码放在函数中。这样你就可以在调用主函数之前运行你的代码并检查语法错误:

    #!/bin/bash
    
    function A {
        ...
    }
    
    function B {
        ...
    }
    
    function main {
        # most of your codes here
        ...
    }
    
    # main "$@"
    

    如果没有发现语法错误,请取消注释最后一行。当然,也有一些例外情况,例如在 eval 上执行的那些、嵌套参数扩展或基于运行时值的扩展,有些是基于内置命令的参数,以及在运行时发现的其他错误。

    【讨论】:

    • 但是你还是执行代码...
    猜你喜欢
    • 2016-09-18
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2014-06-10
    相关资源
    最近更新 更多