如何使用布尔参数调用 bash 函数?

Gil*_*ams 4 unix bash

我有一个名为的函数install_cont,它从我的 bash 脚本中调用了两次。但是,在该函数内部有一个代码块,仅当布尔参数为 true 时我才想执行该代码块。在Python中我会这样做:

def install_cont(expres=False):
    if expres:
         # Do some code...

install_cont(True)
install_cont() # Can call with default False
Run Code Online (Sandbox Code Playgroud)

我如何在 bash 中实现这一目标?在网上阅读,我明白所有变量都是字符串。然而,实现类似布尔参数的最佳方法是什么?

IMS*_*SoP 8

Shell 脚本没有布尔值,但它有一个将成功表示为整数的约定。对于来自其他语言的程序员来说,令人困惑的是,这就是0成功,其他都是失败。

这是运行命令并测试其结果是否成功的构造if基础。您不能直接使用 测试变量if,但可以使用内置test,如果特定测试通过,则该内置变量“成功”。

test也被拼写[为这就是为什么你会经常看到带有 - 的代码if [ ... ]- 这些括号不是if语法的一部分,它们只是一个带有有趣名称的命令。(Bash 也有[[内置的一些额外功能,但[更标准,所以值得学习。)

test命令可以执行各种测试- 检查数字、检查文件系统等。对于命令行选项,您可以针对字符串truefalse使用=二元运算符进行测试。

所以你最终会得到这样的结果:

install_cont() {
    # Name the parameter for convenience
    local expres="$1";

    if [ "$expres" = "true" ];
    then
         # Do some code...
    fi;
}

install_cont true
install_cont # default will not pass the test
Run Code Online (Sandbox Code Playgroud)

如果您想要更高级的参数,您可以使用稍微尴尬的实际默认值${foo:-default}${foo:=default} 参数扩展语法。例如:

install_cont() {
    # Default the mode to "boring"
    local mode="${1:-boring}";

    if [ "$mode" = "exciting" ];
    then
         # Do some code...
    elif [ "$mode" = "boring" ];
    then
         # Do some code...
    else
         echo "Unrecognised mode";
    fi;
}
Run Code Online (Sandbox Code Playgroud)