协慌网

登录 贡献 社区

检查传递给 Bash 脚本的参数数量

如果不满足所需的参数计数,我希望 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.

[[ ]]其他功能组合在一起,那将很有帮助。

请注意, [[ ]](( )) ifcasewhilefor相同的解析级别的关键字。

同样如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