我想我的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

我做错了什么?


当前回答

看看这个bash备考表,它可以帮助很多。

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

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

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

myFunc() {
  if [[ "$#" -gt 0 ]]; then
    for arg in "$@"; do
      echo $arg
    done
  fi
}

myFunc "$@"

这篇文章帮助了我,但对我和我的情况来说,它遗漏了一些东西。希望这能帮助到一些人。

其他回答

这里有很多有用的信息,但我想添加一个我认为有用的简单片段。

它与上面的一些有什么不同?

打印使用到标准错误,这比打印到标准输出更合适 返回另一个答案中提到的退出代码 不使它成为一个班轮…

_usage(){
    _echoerr "Usage: $0 <args>"
}

_echoerr(){
    echo "$*" >&2
}

if [ "$#" -eq 0 ]; then # NOTE: May need to customize this conditional
    _usage
    exit 2
fi
main "$@"

为了安全起见,我建议使用getopts。

这里有一个小例子:

    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-hackers.org/howto/getopts_tutorial

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

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

我希望这能有所帮助。

看看这个bash备考表,它可以帮助很多。

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

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

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

myFunc() {
  if [[ "$#" -gt 0 ]]; then
    for arg in "$@"; do
      echo $arg
    done
  fi
}

myFunc "$@"

这篇文章帮助了我,但对我和我的情况来说,它遗漏了一些东西。希望这能帮助到一些人。

如果你只对缺少特定参数的情况感兴趣,参数替换是很好的选择:

#!/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