检查传递给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中,更喜欢使用[[ ]]因为它不会对其variables进行单词拆分和path名扩展,除非它是expression式的一部分,否则引用可能是不必要的。

 [[ $# -ne 1 ]] 

它还具有一些其他function, extglob引号的条件分组,模式匹配(与extglob扩展模式匹配)和正则expression式匹配。

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

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

对于纯粹的算术expression式,使用(( ))给某些可能仍然会更好,但是它们在[[ ]]中的运算符如-eq-ne-lt-le-gt或者-ge将expression式作为单个string参数放置:

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

如果您需要将其与[[ ]]其他function结合使用,这应该会很有帮助。

参考文献:

  • 打击条件expression式
  • 有条件的构造
  • 模式匹配
  • 分词
  • 文件名扩展(prev。path名扩展)

如果你正在处理数字,那么使用算术expression式可能是一个好主意。

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

On []:!=,=,== …是string比较运算符,-eq,-gt …是二进制的算术运算符。

我会用:

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

要么:

 if [ $# -eq 1 ]; then 

如果您只想保留一个特定的参数, 参数replace是很好的:

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

一个简单的工作class轮可以使用:

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

这分解成:

  1. testingbashvariables的大小参数$#不等于1(我们的子命令数)
  2. 如果为true,则调用usage()函数,并以状态1退出
  3. 否则调用main()函数

想想注意一下:

  • 用法()可以只是简单的回声“$ 0:params”
  • 主要可以是一个长脚本

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

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

我希望这有帮助。

如果你想安全起见,我build议使用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