就像其他简单命令一样,[...]
或 test
命令需要在参数之间添加空格。
if [ "$#" -ne 1 ]; then
echo "Illegal number of parameters"
fi
或者
if test "$#" -ne 1; then
echo "Illegal number of parameters"
fi
建议
在Bash中,建议使用[[ ]]
,因为它不会对其变量进行单词拆分和路径名展开,所以除非它是表达式的一部分,否则可能不需要引用。
[[ $# -ne 1 ]]
它还具有一些其他功能,例如未引用条件分组、模式匹配(使用 extglob
进行扩展模式匹配)和正则表达式匹配。
以下示例检查参数是否有效。它允许一个或两个参数。
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]
对于纯算术表达式,有些人可能仍然认为使用(( ))
更好,但是在[[ ]]
中也可以使用其算术运算符,如-eq
、-ne
、-lt
、-le
、-gt
或-ge
,将表达式作为单个字符串参数放置即可:
A=1
[[ 'A + 1' -eq 2 ]] && echo true ## Prints true.
如果您需要将其与[[ ]]
的其他功能结合使用,这应该很有帮助。
请注意,[[ ]]
和(( ))
是与if
、case
、while
和for
具有相同解析级别的关键字。
正如Dave建议的那样,错误消息最好发送到stderr,以便在stdout被重定向时不被包含:
echo "Illegal number of parameters" >&2
退出脚本
当向脚本传递无效参数时,使其退出是合乎逻辑的。这已经在评论中由ekangas建议过,但某人编辑了此答案并将其返回值更改为-1
,所以我也可以做正确的事情。
-1
虽然被Bash接受为exit
的参数,但它没有明确文档说明,并且不应作为常规建议使用。 64
也是最正式的值,因为它在sysexits.h
中定义为#define EX_USAGE 64 /* command line usage error */
。像ls
这样的大多数工具在出现无效参数时也返回2
。 我过去也在我的脚本中返回2
,但最近我不再关心,只是在所有错误中简单地使用1
。但是让我们把2
放在这里,因为它是最常见的,可能不特定于操作系统。
if [[ $# -ne 1 ]]; then
echo "Illegal number of parameters" >&2
exit 2
fi
参考资料
test
应该是可以的,对吧,@Barmar? - user253751