$#
представляет количество аргументов командной строки, переданных сценарию.
sh-3.2$ cat a.sh
echo $# #print the number of cmd line args.
sh-3.2$ ./a.sh
0
sh-3.2$ ./a.sh foo
1
sh-3.2$ ./a.sh foo bar
2
sh-3.2$ ./a.sh foo bar baz
3
При использовании внутри функции (как в вашем случае) он представляет количество аргументов, переданных функции:
sh-3.2$ cat a.sh
foo() {
echo $# #print the number of arguments passed to the function.
}
foo 1
foo 1 2
foo 1 2 3
sh-3.2$ ./a.sh
1
2
3
$#
— количество аргументов, переданных сценарию. См. полный список в подразделе Special Parameters раздела PARAMETERS справочной страницы bash(1)
.
$#
= Количество аргументов, переданных функции.
в вашем коде, функция вернет 0, если функция не вызывается с одним параметром хотя бы.