Check number of arguments passed to a Bash script

I would like my Bash script to print an error message if the required argument count is not met.

I tried the following code:

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

For some unknown reason I've got the following error:

test: line 4: [2: command not found

What am I doing wrong?


Just like any other simple command, [ ... ] or test requires spaces between its arguments.

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

Or

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

When in Bash, prefer using [[ ]] instead as it doesn't do word splitting and pathname expansion to its variables that quoting may not be necessary unless it's part of an expression.

[[ $# -ne 1 ]]

It also has some other features like unquoted condition grouping, pattern matching (extended pattern matching with extglob ) and regex matching.

The following example checks if arguments are valid. It allows a single argument or two.

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

For pure arithmetic expressions, using (( )) to some may still be better, but they are still possible in [[ ]] with its arithmetic operators like -eq , -ne , -lt , -le , -gt , or -ge by placing the expression as a single string argument:

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

That should be helpful if you would need to combine it with other features of [[ ]] as well.

References:

  • Bash Conditional Expressions
  • Conditional Constructs
  • Pattern Matching
  • Word Splitting
  • Filename Expansion (prev. Pathname Expansion)

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

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

    On []: !=, =, == ... are string comparison operators and -eq, -gt ... are arithmetic binary ones.

    I would use:

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

    Or:

    if [ $# -eq 1 ]; then
    
    链接地址: http://www.djcxy.com/p/24146.html

    上一篇: 从文件设置环境变量

    下一篇: 检查传递给Bash脚本的参数的数量