Outros já mencionaram que $# é o número de argumentos da linha de comando, então vou ignorar essa parte da sua pergunta.
Com cmd1 && cmd2 , o shell executa primeiro cmd1 . Se cmd1 falhar, a expressão inteira falhará. Se cmd1 for bem-sucedido, o shell continuará executando cmd2 . A expressão inteira é bem-sucedida se ambos cmd1 e cmd2 forem bem-sucedidos. Portanto, o operador && é o booleano de curto-circuito AND aplicado aos comandos do shell. As utilizações deste operador podem ser substituídas por
if cmd1
then
cmd2
fi
Com cmd1 || cmd2 , o shell executa primeiro cmd1 . Se for bem sucedido, toda a expressão é bem sucedida. Caso contrário, o shell executará cmd2 e o sucesso ou a falha da expressão será determinada por cmd2 . Em suma, este é o booleano de curto-circuito OU aplicado aos comandos do shell. Você pode substituir este formulário por
if ! cmd1
then
cmd2
fi
Eu usei com cuidado as frases sucedidas / sucedidas e com falha / falhar acima. Sucesso, para comandos de shell, é definido como um status de saída do processo de zero. Falha é qualquer status diferente de zero. No entanto, tentar entender os operadores && e || em termos de status de saída é, pelo menos para mim, confuso, já que você acaba com um tipo estranho de lógica invertida.