Qual é o propósito de ter uma expressão booleana contendo um código de saída neste script de shell?

1

Eu tenho um problema resolvido por esta resposta link

Agora eu preciso expandi-lo para fazer outras coisas, mas primeiro preciso entender melhor como ele funciona antes de modificá-lo. Aqui está o script em questão:

#!/bin/bash

(( $# != 2 )) && exit 1

for f in *; do
  newf="${f//$1/$2}"
  if [[ $f != $newf ]]; then
    mv "$f" "$newf"
  fi
done

O que (( $# != 2 )) && exit 1 faz? Eu tive pouca sorte em encontrar explicações online: descobri o que cada componente é, mas não o que a linha inteira faz no script como um todo. A resposta não explicou essa linha. O pôster estava online pela última vez há mais de 2 anos e eu não queria necro uma pergunta de 5 anos, então aqui estou eu.

    
por thegreatjedi 28.09.2017 / 10:34

2 respostas

1

É um operador de controle

De bash man :  

 The control operators && and || denote AND lists and OR lists, respectively.
 An AND list has the form
command1 && command2
command2 is executed if, and only if, command1 returns an exit status of zero. [..cut..] The return status of AND and OR lists is the exit status of the last command executed in the list.
 Um operador de controle é  
    A token that performs a control function.  It is one of the following symbols:
        || & && ; ;; ( ) | 
 

(créditos)

Portanto, neste caso, não leia && como um operador booleano. Então agora você sabe quando exit 1 é executado - somente no sucesso do comando anterior (se o status de saída for zero).

Veja esta serverfault asnswer para explicação de && em 3 contextos diferentes no Bash. Útil para aprender distinções entre eles.

    
por 28.09.2017 / 10:42
1

Ele sai do script nessa linha se não houver exatamente dois argumentos passados para o script.

  • $# é o número de argumentos transmitidos ao chamar o script, análogo a argc em C

  • (( $# != 2 )) retorna com um código truey ( 0 ) se o número de argumentos não for igual a 2

  • && executa o lado direito somente se o lado esquerdo sair com um código truey. O que significa que o lado direito é executado se o número de argumentos não for 2.

  • exit 1 sai do script com o código de saída falsey de 1 . Isso anula o script neste momento e informa o chamador que houve um erro.

por 28.09.2017 / 10:44