Eu estava vasculhando um /etc/rc.d/init.d/sendmail
arquivo (eu sei que isso quase nunca é usado, mas estou estudando para um exame) e fiquei um pouco confuso sobre &&
os ||
operadores e. Eu li onde eles podem ser usados em declarações como:
if [ test1 ] && [ test2 ]; then
echo "both tests are true"
elif [ test1 ] || [ test2 ]; then
echo "one test is true"
fi
No entanto, este script mostra instruções de linha única, como:
[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE"
[ -f /usr/sbin/sendmail ] || exit 0
Eles parecem estar usando os operadores &&
e ||
para obter respostas com base em testes, mas não consegui descobrir a documentação relativa a esse uso específico desses operadores. Alguém pode explicar o que esses fazem nesse contexto específico?
fonte
[ ... ]
um programa", como em muitos casos é . É comum no arquivo/bin/[
ou/usr/bin/[
.test
vez deif
ou[
. Eif [
eif test
parecem ser intercaladas com[
etest
sem rima ou razão aparente.test
aparece ocasionalmente, como no config.site para bibliotecas de fornecedores no Fedora x86_64 .Aqui está minha cábula:
fonte
(a => b => a)
. "direita (aka false)":(a => b => b)
. "A; B" "então"(a => b => (() => b())(a()))
. "A && B" "se sem mais (quando)"(a => b => a()(() => right)(b))
. "A || B" "senão sem se (a menos)"(a => b => a()(b)(() => right))
. "a && b || c" "ifThenElse"(a => b => c => (unless(when(a)(b))(c))())
.para expandir a resposta de @ Shawn-j-Goff de cima,
&&
é um AND lógico e||
é um OR lógico.Veja esta parte do Advanced Bash Scripting Guide. Parte do conteúdo do link para referência do usuário, como abaixo.
&& AND
|| OU
fonte
Pela minha experiência, eu uso o && e || para reduzir uma instrução if para uma única linha.
Digamos que estamos procurando um arquivo chamado /root/Sample.txt, a iteração tradicional seria a seguinte no shell:
Essas 6 linhas podem ser reduzidas a uma única linha:
Ao executar algumas iterações para definir variáveis ou criar arquivos etc., a vida é mais fácil e o script parece mais veloz usando a função if de linha única, o único inconveniente é que fica um pouco mais difícil implementar vários comandos a partir de uma única iteração. você pode fazer uso de funções.
fonte
./someScript.sh & && echo 'ok' || echo 'ko'
Existe uma noção de "atalho".
Quando
(expr1 && expr2)
é avaliado -expr2
só é avaliado se forexp1
avaliado como "verdadeiro". Isso ocorre porque ambosexpr1
Eexpr2
precisam ser verdadeiros para(expr1 && expr2)
serem verdadeiros. Seexpr1
avalia como "false"expr2
NÃO é avaliado (atalho) porque(expr1 && expr2)
já é "flase".Tente o seguinte - suponha que o arquivo
F1
exista e o arquivoF2
não exista:Da mesma forma para
||
(ou) - mas o corte curto é revertido.fonte
Os exemplos na resposta de Shawn J. Goff estão corretos, mas a explicação é o contrário. Por favor, verifique:
fonte
&&
resultados em toda a expressão para retornar false ?