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; }
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?
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!
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…
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. :)
É 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 comset -e
.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. ;-)
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 usarset -e
, pois&&
não é exatamente igual aoif
“.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.