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.