我有一个名为的函数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 中实现这一目标?在网上阅读,我明白所有变量都是字符串。然而,实现类似布尔参数的最佳方法是什么?
Shell 脚本没有布尔值,但它有一个将成功表示为整数的约定。对于来自其他语言的程序员来说,令人困惑的是,这就是0
成功,其他都是失败。
这是运行命令并测试其结果是否成功的构造的if
基础。您不能直接使用 测试变量if
,但可以使用内置test
的,如果特定测试通过,则该内置变量“成功”。
test
也被拼写[
为这就是为什么你会经常看到带有 - 的代码if [ ... ]
- 这些括号不是if
语法的一部分,它们只是一个带有有趣名称的命令。(Bash 也有[[
内置的一些额外功能,但[
更标准,所以值得学习。)
该test
命令可以执行各种测试- 检查数字、检查文件系统等。对于命令行选项,您可以针对字符串true
或false
使用=
二元运算符进行测试。
所以你最终会得到这样的结果:
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)