Múltipla Lista de Comandos Após os Conditional Shell, &&, ||. Shell Script, Dash

3

Estou tentando fazer vários comandos após uma condição, por exemplo ...

[ $VAR ] || echo "Error msg" ; echo "exit"

e o inverso

[ -z $VAR ] &&  echo "Error msg" ; echo "exit"

Eu sei que não funcionará como pretendido, eu realmente sabia o quanto antes e esqueci como fazer isso. Estou totalmente ciente das muitas alternativas, como usar if 's ou bracketing via () e {} . Usar () criará um subprocesso que não sairia de um script em execução. Usar {} funcionará, mas eu sei que existe uma alternativa mais legível.

Eu fiz isso com : , e foi perfeito !!! Eu não me lembro agora da minha vida, e perdi aquele roteiro escrito anteriormente.

Se alguém souber como escrever isso com : , eu realmente apreciaria qualquer ajuda!

    
por J. M. Becker 27.12.2011 / 05:10

3 respostas

5

Eu costumo usar algo assim, que considero bem legível:

[ -z $VAR ] && {
  echo "Error msg"
  exit ${LINENO}
} >&2

Para : , a única coisa que posso imaginar é que você de alguma forma definiu uma função, mas não tenho ideia de como isso se traduziria em um bloco que permite a execução de vários comandos.

Em man bash :

: [arguments]
        No effect; the command does nothing beyond expanding arguments and
        performing any specified redirections. A zero exit code is returned.

Portanto, a única possibilidade que vejo é se você tivesse redefinido : para outra coisa. Eu estarei interessado em ver quaisquer possibilidades sobre o que poderia ser.

    
por 27.12.2011 / 06:19
5

A alternativa mais legível é

if [ "$VAR" ]; then
  echo "Error msg" 1>&2
  exit 1
fi

Eu sei que não é isso que você está procurando. Mas é o que você deve escrever. Usar && e || aqui é um pouco enigmático. Eu não tenho idéia do que você está lembrando (ou se esquecendo), mas seja o que for, se ninguém aqui pode sequer adivinhar o que é, com certeza não é algo que se qualifica como "legível".

A propósito, observe as aspas em torno de $VAR . Sempre coloque aspas duplas em torno das substituições de variáveis , a menos que você saiba por que precisa deixar as citações e por que é seguro fazê-lo. (Você não precisa de citações dentro de [[ … ]] , mas com certeza fará dentro de [ … ] ).

eval é uma maneira sorrateira de agrupar comandos, mas usá-lo não se qualifica como legível.

Outra maneira de produzir saída dentro de outro comando é fazê-lo dentro de uma substituição de comando. Novamente, isso não se qualifica como legível.

[ "$VAR" ] && exit 1$(echo "error message" >&2)

Sem alguma forma de construção de agrupamento (independentemente de serem chaves ou algum outro composto como if / then / fi ou while / do / done ), não é possível executar mais de um comando no processo principal do shell; todos, exceto um, estarão em uma subcamada.

    
por 28.12.2011 / 00:12
0

experimente este [[$var]] && echo "something" || echo "something";

    
por 27.12.2011 / 07:48