Você está chamando a função main
sem argumento. Então, $#
na função principal é sempre 0.
Cada instância da função possui seus próprios argumentos. (“Instância” significa que se a função for iniciada várias vezes (por meio de chamadas recursivas), cada chamada terá seus próprios argumentos.) Os parâmetros posicionais $1
, $2
, etc., bem como os parâmetros associados $#
, $*
e $@
referem-se aos argumentos passados na chamada de função. Por exemplo, se você chamar main foo bar
, dentro da função main
, o valor de $1
será foo
, o valor de $#
será 2 e assim por diante.
Se você quiser passar os argumentos do script para uma função, use "$@"
. Essa construção se expande para a lista de argumentos passados para o script (ou para a função, se chamada dentro de uma função). Observe que, diferentemente do que acontece normalmente com aspas duplas, os parâmetros são transmitidos separadamente, "$@"
é uma lista de strings e não uma única string. As aspas duplas são necessárias, caso contrário, os parâmetros não serão transmitidos como estão, mas serão tratados como uma lista separada por espaço em branco de padrões de nome de arquivo.
function main {
if (( $# < 1 )); then
usage
fi
echo "good"
}
main "$@"