condition && command + exit

2

Enquanto escrevia uma ferramenta shell simples, encontrei uma peça em que não sei como fazê-la funcionar.

  [ "$#" -ne 3 ] || echo "wrong number of arguments" && exit

O funcionamento acima funciona como pretendido porque é difícil conceber condições em que o eco possa falhar. Mas e se eu substitui o echo por um comando que pode falhar e ainda executar o exit ?

Isso não funcionará, porque exit sai do shell gerado com ( ) e não o principal:

  [ "$#" -ne 3 ] && ( command ; exit )

Isso sairá sempre:

  [ "$#" -ne 3 ] && command ; exit 

Eu poderia usar a sintaxe detalhada:

 if [ "$#" -ne 3 ] ; then 
      command 
      exit
 fi

mas se eu não quiser engajar if e manter a sintaxe concisa - como eu posso encadear a execução condicional de comandos, incluindo exit assim?

    
por SF. 05.08.2014 / 12:46

2 respostas

10

Você pode agrupar o comando entre chaves:

[ "$#" -ne 3 ] || { command; exit; }

{ list; } faz com que o comando listas seja executado no contexto atual da shell, não na subshell.

Leia mais sobre os comandos bash Agrupamento de comandos

    
por 05.08.2014 / 12:52
3

Tente isso

f() { [ "$#" -ne 3 ] && { command ; exit; }; }; f 1 2 3

Então

f() { [ "$#" -ne 3 ] && { command ; exit; }; }; f 1 2
    
por 05.08.2014 / 12:54