[: 在 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 修复了错误。
所以我正在编写 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 修复了错误。