如果不满足所需的参数计数,我希望 Bash 脚本打印一条错误消息。
我尝试了以下代码:
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
then echo "illegal number of parameters"
fi
由于某些未知的原因,我遇到了以下错误:
test: line 4: [2: command not found
我究竟做错了什么?
像任何其他简单命令一样, [ ... ]
或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"
exit 2
fi
如果要处理数字,最好使用算术表达式。
if (( $# != 1 )); then
>&2 echo "Illegal number of parameters"
fi
>&2
用于将错误消息写入 stderr。
在 [] 上:!=,=,== ... 是字符串比较运算符,-eq,-gt ... 是算术二进制运算符。
我会用:
if [ "$#" != "1" ]; then
或者:
if [ $# -eq 1 ]; then