[: 在 bash 脚本中缺少 `]'

[: missing `]' in bash script

所以我正在编写 bash shell 脚本,我的前几行如下所示:

if ! [ $# -eq 0 || $# -eq 1 ]; then
    echo -e "Usage: myScriptName [\e[3mdir\e[0m] [\e[3m-f file\e[0m]"
    exit 1
fi

但是当我 运行 它时,它显示“[: missing `]'”。我没有看到遗漏的 ],除了 ; 什么都没有。正在触摸 ],所以我错过了什么?

您不能在单大括号测试表达式中使用像 || 这样的运算符。你必须做

! [[ $# -eq 0 || $# -eq 1 ]]

! { [ $# -eq 0 ] || [ $# -eq 1 ]; }

! [ $# -eq 0 -o $# -eq 1 ]

双括号关键字是一个 bash 表达式,不能与其他 POSIX shell 一起使用,但它也有一些好处,例如能够执行这些类型的操作操作更具可读性。

当然,有很多方法可以测试传递的参数数量。 的存在也将回答您的问题。

在某些情况下,即使一切看起来都像上面提到的@kojiro 一样正常,也会发生此错误。在这种情况下,简单而适当的换行符会有所帮助。 if-statement 您正在检查 || 的地方应该有一个与其先前代码行的换行符。

在我的例子中,我遇到了以下错误:

if [ $# -eq 1]; then

请注意 1] 之间没有 space。添加 space 修复了错误。