为什么使用双括号来“确保”某些命令,因为它不是“是否存在”(假/真)的逻辑检查?

为什么使用双括号来“确保”某些命令,因为它不是“是否存在”(假/真)的逻辑检查?

最近,我一直在尝试找出脚本中某些行背后越来越多的 shell 语法和逻辑,我有以下问题:[[expression]]示例中的目的是什么,因为它没有给执行行带来任何价值,因此可以跳过并仅使用 ? 之后的实际表达式完成[[]]

export SDKMAN_DIR="$HOME/.sdkman"
[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

我的假设是,这是某种检查,以防某些值丢失(空指针异常),但我不认为运算"[[]]"符会做类似的事情?该脚本的目标很简单 => 导出sdk以便从终端全局可用。

答案1

-s file 条件表达式检查指定的文件是否存在并且不为空。这[[…]]复合命令以适当的状态退出,具体取决于双括号内表达式的计算结果。

因此

[[ -s "$HOME/.sdkman/bin/sdkman-init.sh" ]] && source "$HOME/.sdkman/bin/sdkman-init.sh"

$HOME/.sdkman/bin/sdkman-init.sh当存在且不为空时才提供源。

(我假设export SDKMAN_DIR="$HOME/.sdkman"是在单独的一行上。)

答案2

在我的本地计算机上(根据经验)“[”是 bash 中 /usr/bin/test 的别名。显然确实[[如此不是扩展到/usr/bin/test/usr/bin/test(因为之间没有空格)。在 bash(也可能是其他 shell)中,双方括号是一个保留字,它使用 shell 内部表达式计算器而不是调用 /usr/bin/test。

$HOME/.sdkman/bin/sdkman-init.sh如果设置变量后文件的长度非零,则此处的代码将在当前 shell 中执行。我不知道这样做的目的是什么(因为零长度文件实际上不会做任何事情)。

相关内容