Shell: Use && e || ao invés de if/then/fi

Palavras-chave: shell, condicional, if, operadores, and, or

Para condicionais simples, que não precisem do else você pode usar os operadores && (and) e || (or) ao invés da estrutura if/then/fi.

if [ $var -ne 1 ]; then
	echo "Não é 1"
fi

if ! test -w $file; then
	echo "$file não é gravável"
fi

Agora os mesmos comandos usando os operadores. Veja como a sintaxe fica mais simples e clara:

[ $var -ne 1 ] && echo "Não é 1"

test -w $file || echo "$file não é gravável"

Se precisar de mais de um comando após o teste, faça um bloco com as chaves:

test -w $file || { echo "$file não é gravável"; exit 1; }
This entry was posted in Shell. Bookmark the permalink.

9 Responses to Shell: Use && e || ao invés de if/then/fi

  1. Eu gosto de usar set -e nos meus scripts. Nesse caso, usar && e || faz com que o script aborte caso a condição seja falsa.

    Assim, eu costumo usar sempre if..then..fi, porque não abro mão do set -e, e não gostaria de usar algo como a && b || :.

    O que me aconselha?

    • Rafael Lopes says:

      Aconselho a, ao fazer esse “if ternário”, não fazer nada que um if/else não faria. Caso deseje abortar a execução do script, use return ou exit, dependendo do caso!

  2. Eu não conhecia o ‘set -e’, acho que essa opção deveria se transformar em uma outra dica sobre shell *e* citar que ela impede que essa dica do Aurélio funcione…

  3. eljunior says:

    usando set -e, o shell não aborta se o comando que falhar estiver numa lista de && e ||.

    pode usar tranquilamente os && e || usando set -e. :)

  4. É verdade que no caso comum && e || funcionam. O que aconteceu comigo foi uma pegadinha. Veja o exemplo abaixo:

    $ cat a.sh
    #!/bin/sh
    set -e

    faz_teste()
    {
    [ -r /tmp/naoexiste ] && echo existe
    }

    faz_teste
    echo fim

    E ao rodar o script:

    $ ./a.sh
    $

    Nenhuma saída. Oops. :)

    Então não posso usar tão tranquilamente, assim. Eu já caí nessa pegadinha, e foi o que me levou a achar que && e || não funcionavam com set -e.

  5. eljunior says:

    o “echo fim” não executou porque o faz_teste retornou 1 como exit status (a funcao retorna o último exit status, neste caso, o exit status do “[ -r /tmp/naoexiste ]”.

    o shell não abortou a execução por causa do “[ -r /tmp/naoexiste ]”, e sim por causa do “faz_teste”. para usar com segurança, você deve retornar o exit status em funções como essa. ;-)

  6. Sim, essa a razão a pegadinha. Mas é uma diferença entre o if e o &&, e o que tornou uma “pegadinha” para mim.

    Então, corrigindo: no meu primeiro comentário, onde está “quebra o set -e“, leia-se “cuidado se usar set -e, pois && não é exatamente igual ao if“.

  7. Pingback: [CC] If em 1 linha (shell script) « Blog do Daniel Bauermann

  8. Lia says:

    Preciso fazer uma condição
    ex:
    Procurar em uma pasta o nome de uma base que eu quero, depois ele mostrar a base, caso a base nao seja correta, mostrar que “a base não foi encontrada”.
    estou tentando usar:

    if [[ -z $1 ]]
    then
    echo “Passe o nome da base para saber qual instancia.”
    exit
    elif [[ -e $arq ]]
    then
    não estou conseguindo, depois deste script use o comando grep para pesquisar onde esta uma base que eu quero.

Leave a Reply

Your email address will not be published. Required fields are marked *