所以我正在编写一个 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
但是当我运行它时,它显示“[:缺少`]'”。我没有看到缺少 ],除了 ; 之外什么都没有。正在触摸],那么我错过了什么?
您不能在单括号测试表达式中使用像
||
这样的运算符。你必须这样做
! [[ $# -eq 0 || $# -eq 1 ]]
或
! { [ $# -eq 0 ] || [ $# -eq 1 ]; }
或
! [ $# -eq 0 -o $# -eq 1 ]
双括号关键字是一个 bash 表达式,不能与其他 POSIX shell 一起使用,但它也有一些好处,例如能够更容易地执行此类操作。
当然,有很多方法可以测试传递的参数数量。
$2
的存在也能回答你的问题。
就我而言,我遇到了以下错误:
if [ $# -eq 1]; then
请注意,
1
和 ]
之间没有空格。添加空格修复了错误。
在某些情况下,即使一切看起来都很好,如上面提到的@kojiro,也会发生此错误。在这种情况下,简单而适当的换行会有所帮助。
if-statement
您使用 ||
检查的位置应该与前一行代码有一个换行符。
相关,但不考虑下面的案例
Bash 脚本缺少 ']'
未显示行号,仅显示
bash: [: missing ']'
大坏蛋:
bash 函数没有与包含定义的文件相关的行号。
现在:代码存储在正在运行的 Bash 实例内部的某个地方 - 真的需要天才才能真正分辨出该函数内部的哪一行发生了错误吗?
通过在单独的文件中复制该函数来揭示实际的错误行,
以
#!/bin/env bash
作为第一行。
导致错误的行:
if [ mount | grep "$device" >/dev/null 2>&1 ];then
当执行到达时:
~/bin/bug_hunting.sh: line 117: [: missing `]'
在
];
之间添加空格没有什么区别。
移除
[
和]
,故障就会消失。