[:bash 脚本中缺少`]'

问题描述 投票:0回答:4

所以我正在编写一个 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

但是当我运行它时,它显示“[:缺少`]'”。我没有看到缺少 ],除了 ; 之外什么都没有。正在触摸],那么我错过了什么?

bash sh brackets
4个回答
32
投票

您不能在单括号测试表达式中使用像

||
这样的运算符。你必须这样做

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

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

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

双括号关键字是一个 bash 表达式,不能与其他 POSIX shell 一起使用,但它也有一些好处,例如能够更容易地执行此类操作。

当然,有很多方法可以测试传递的参数数量。

$2
的存在也能回答你的问题。


16
投票

就我而言,我遇到了以下错误:

if [ $# -eq 1]; then

请注意,

1
]
之间没有空格。添加空格修复了错误。


0
投票

在某些情况下,即使一切看起来都很好,如上面提到的@kojiro,也会发生此错误。在这种情况下,简单而适当的换行会有所帮助。

if-statement
您使用
||
检查的位置应该与前一行代码有一个换行符。


0
投票

相关,但不考虑下面的案例
Bash 脚本缺少 ']'

未显示行号,仅显示

bash: [: missing ']'

大坏蛋:
bash 函数没有与包含定义的文件相关的行号。
现在:代码存储在正在运行的 Bash 实例内部的某个地方 - 真的需要天才才能真正分辨出该函数内部的哪一行发生了错误吗?


通过在单独的文件中复制该函数来揭示实际的错误行,

#!/bin/env bash
作为第一行。

导致错误的行:

if [ mount | grep "$device" >/dev/null 2>&1 ];then

当执行到达时:

~/bin/bug_hunting.sh: line 117: [: missing `]'

];
之间添加空格没有什么区别。

移除

[
]
,故障就会消失。

© www.soinside.com 2019 - 2024. All rights reserved.