Qual é a diferença entre duas abordagens de avaliação de condição no bash?

5

Gostaria de saber se existe uma diferença entre

if [ $x -eq $y -o $x -eq 1 ]
if [ $x -eq $y ] || [ $x -eq 1 ]

Ambos parecem funcionar. Obrigado

    
por MusicAndCode 13.11.2016 / 20:55

2 respostas

10

TL; DR : eles não são iguais e o propósito é um pouco diferente, embora eles tenham o mesmo efeito desejado.

A diferença está em quem faz a verificação lógica. Como você deve saber, os colchetes são sinônimos do comando test . Portanto, com -o , você vê o comando single test e as duas condições são avaliadas juntas e, em seguida, retornam o status de saída para bash.

Com && , você tem duas declarações test , cada uma retornando separadamente, mas depois o bash avalia se ambas são verdadeiras. O último é recomendado hoje em dia, já que test é um pouco datado e tem problemas (e a nova versão do teste [[ é frequentemente recomendada, veja this ), além disso, é muito mais legível, pois os && ou || são usados em muitas outras linguagens, incluindo C e Java.

Portanto, no primeiro caso, com [ você avalia duas expressões, com && avalia os status de saída de dois [ comandos.

Informações adicionais :

Como apontado por @steeldriver nos comentários, há de fato um comando interno test , que é a implementação interna do bash de /usr/bin/test . Independentemente desse fato, a maneira como test e /usr/bin/test trabalham sintaticamente é exatamente a mesma.

Tenha em mente, entretanto, que se você estiver usando algum outro shell que não seja bash ou o shell padrão% do Ubuntudash, provavelmente você estará usando /usr/bin/test . O shell Korn, ksh , por exemplo, não possui test interno.

Tenha em mente também o fato de que && e test não são equivalentes :

  • test deve avaliar as declarações e retornar o status de saída como qualquer outro comando (consulte especificações POSIX para teste ). Ele tem uma lista completa de coisas que você pode avaliar - existência de arquivos, tipos de arquivos, comparação de inteiros e string.
  • Os operadores lógicos, como && e || , são usados pelos shells para avaliar os status de saída de comandos separados, como ; , que é uma das razões em que esses operadores estão sob Lists section . Além disso, eles não podem ser um comando autônomo, como test - eles são operadores de lista de shell padrão . Portanto, ao contrário de test , você não pode usar && para verificar se o arquivo existe; você só pode saber se o comando à esquerda foi finalizado com sucesso ou com falha e executar ou não executar o segundo comando de acordo.
por Sergiy Kolodyazhnyy 13.11.2016 / 21:13
1

A única diferença que posso ver é que o primeiro de seu comando funcionaria como um único processo ( [ , AKA test )., enquanto o segundo poderia produzir dois processos se o primeiro comando retornasse zero.

Nenhuma diferença fundamental em contrário.

    
por SYN 13.11.2016 / 21:05