关于参数传递:检查传递给bash脚本的参数数量

Check number of arguments passed to a Bash script

如果不满足所需的参数计数,我希望bash脚本打印一条错误消息。

我尝试了以下代码:

1
2
3
4
5
6
#!/bin/bash
echo Script name: $0
echo $# arguments
if [$# -ne 1];
    then echo"illegal number of parameters"
fi

由于某些未知原因,我出现了以下错误:

1
test: line 4: [2: command not found

我做错什么了?


和其他简单命令一样,[ ... ]test在其参数之间需要空格。

1
2
3
if ["$#" -ne 1 ]; then
    echo"Illegal number of parameters"
fi

1
2
3
if test"$#" -ne 1; then
    echo"Illegal number of parameters"
fi

在bash中,更喜欢使用[[ ]],因为它不会对变量进行分词和路径名扩展,除非它是表达式的一部分,否则引用可能是不必要的。

1
[[ $# -ne 1 ]]

它还具有一些其他的特性,比如不带引号的条件分组、模式匹配(与extglob的扩展模式匹配)和regex匹配。

下面的示例检查参数是否有效。它允许一个或两个参数。

1
[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]

对于纯算术表达式,使用(( ))到某些表达式可能仍然更好,但在[[ ]]中,使用其算术运算符(如-eq-ne-lt-le-gt-ge)仍有可能,方法是将表达式作为单个字符串参数:

1
2
A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

如果您还需要将它与[[ ]]的其他特性结合起来,这将是很有帮助的。

参考文献:

  • bash条件表达式
  • 条件构造
  • 模式匹配
  • 词拆分
  • 文件扩展名(前路径名扩展)

如果处理数字,使用算术表达式可能是个好主意。

1
2
3
if (( $# != 1 )); then
    echo"Illegal number of parameters"
fi


关于[ ]:=,=,=…是字符串比较运算符和-eq、-gt…是算术二进制的。

我会用:

1
if ["$#" !="1" ]; then

或:

1
if [ $# -eq 1 ]; then


如果您只想在缺少某个特定参数的情况下退出,那么参数替换非常好:

1
2
3
4
5
6
7
#!/bin/bash
# usage-message.sh

: ${1?"Usage: $0 ARGUMENT"}
#  Script exits here if command-line parameter absent,
#+ with following error message.
#    usage-message.sh: 1: Usage: usage-message.sh ARGUMENT


一个简单的一行程序可以使用:

1
["$#" -ne 1 ] && ( usage && exit 1 ) || main

这可分为:

  • 测试bash变量的参数大小$不等于1(我们的子命令数)
  • 如果为true,则调用usage()函数并退出,状态为1
  • else调用main()函数
  • 想注意:

    • 用法()可以是简单的echo"$0:params"
    • 主脚本可以是一个长脚本


    看看这个bash作弊表,它可以帮助很多人。

    要检查传入参数的长度,可以使用"$#"

    要使用传入的参数数组,可以使用"$@"

    检查长度和迭代的一个例子是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    myFunc() {
      if [["$#" -gt 0 ]]; then
        for arg in"$@"; do
          echo $arg
        done
      fi
    }

    myFunc"$@"

    这篇文章对我有帮助,但对我和我的处境来说缺少了一些东西。希望这能帮助别人。


    这里有一个简单的一行程序来检查是否只有一个参数,否则退出脚本:

    1
    ["$#" -ne 1 ] && echo"USAGE $0 <PARAMETER>" && exit

    如果你想安全的话,我建议你使用getopts。

    下面是一个小例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
        while getopts"x:c" opt; do
          case $opt in
            c)
              echo"-$opt was triggered, deploy to ci account">&2
              DEPLOY_CI_ACCT="true"
              ;;
                x)
                  echo"-$opt was triggered, Parameter: $OPTARG">&2
                  CMD_TO_EXEC=${OPTARG}
                  ;;
                \?)
                  echo"Invalid option: -$OPTARG">&2
                  Usage
                  exit 1
                  ;;
                :)
                  echo"Option -$OPTARG requires an argument.">&2
                  Usage
                  exit 1
                  ;;
              esac
            done

    如http://wiki.bash-hacker.org/howto/getopts_tutorial


    您应该在测试条件之间添加空格:

    1
    2
    3
    if [ $# -ne 1 ];
        then echo"illegal number of parameters"
    fi

    我希望这有帮助。