What does $# mean in shell?

You can always check the man page of your shell. man bash says:

Special Parameters
   #      Expands to the number of positional parameters in decimal.

Therefore a shell script can check how many parameters are given with code like this:

if [ "$#" -eq 0 ]; then
  echo "you did not pass any parameter"
fi

Actually,

`$` refer to `value of` and
`#` refer to `number of / total number`

So together

`$#` refer to `The value of the total number of command line arguments passed.`

Thus, you can use $# to check the number of arguments/parameters passed like you did and handle any unexpected situations.

Similarly, we have

`$1` for `value of 1st argument passed`
`$2` for 'value of 2nd argument passed`

etc.


That is

  1. the number of parameters with which the script has been called

  2. the number of parameters which have been set within the script by set -- foo bar

  3. (when used within a function) the number of parameters with which a function has been called (set would work there, too).

This is explained in the bash man page in the block "Special Parameters".